2013-09-21 1 views
1

Я получаю список из компонентов базы данных, и я делаю новый список somelist = componentinets. Я конвертирую некоторые значения somelist с convert (somelist). Это изменяет оба списка. Есть ли способ сохранить исходный список ингредиентов? Наверное, я делаю что-то неправильно. Должен ли я получить второй список из базы данных?Java LIst по умолчанию и изменен список

List <Ingredient> somelist = new ArrayList<>(); 
    somelist = ingredients; 

    convert.showImperial(somelist); 


public List<Ingredient> showImperial(List<Ingredient> ingredients) { 


    for (int i = 0; i < ingredients.size(); i++) { 
     switch (ingredients.get(i).getMeasurement()) { 
      case GRAMS: { 
       Double value = ingredients.get(i).getValue(); 

       if (value >= 453.59237) { 
        value = value/453.59237; 
        BigDecimal rounded = new BigDecimal(value); 
        rounded=rounded.setScale(2, RoundingMode.HALF_DOWN); 
        ingredients.get(i).setValue((rounded.doubleValue())); //to pound 
        ingredients.get(i).setMeasurement(POUNDS); 
       } else { 
        value = value * 16/453.59237; //to oz; 
        System.out.println(value); 
        BigDecimal rounded = new BigDecimal(value); 
        rounded = rounded.setScale(1, RoundingMode.HALF_DOWN); 
       // System.out.println(rounded); 
       // System.out.println(rounded.doubleValue()); 
        ingredients.get(i).setValue(rounded.doubleValue()); 
        ingredients.get(i).setMeasurement(OUNCE); 
       } 
       break; 
      } 
      case ML: { 
       double value = ingredients.get(i).getValue(); 
       ingredients.get(i).setValue(value/240); 
       ingredients.get(i).setMeasurement(CUP); //to cup 
       break; 
      } 
      default: { 
       break; 
      } 
     } 
    } 
    return ingredients; 
} 

ответ

1

Эта линия:

somelist = ingredients; 

не делает копию ingredients, это установка somelist быть такой же, как ingredients.

Вы можете просто добавить все элементы из ingredients в somelist:

somelist.addAll(ingredients); 

... но вы, кажется, изменяя те, и List содержит ссылку на элементы, а не фактические элементы. Так что вам нужно пойти на шаг дальше и скопировать один уровень глубже:

for (Ingredient ingr : ingredients) { 
    somelist.add(new Ingredient(ingr)); // or use whatever constructor is appropriate. 
} 
+0

Спасибо, это работает. – Pavel

0

Если вы используете ArrayList в качестве реализации в somelist вы можете просто создать с помощью этого конструктора.

List <Ingredient> somelist = new ArrayList<>(ingredients); 

Обратите внимание, что это копия списка, если добавить некоторые элементы в ingredients не будут отражены в someList и наоборот.

Пример:

List <Ingredient> somelist = new ArrayList<>(ingredients); 
ingredients.add(new Ingredient()); // won't be reflected in somelist 

Но если вы мутировать элементы из списка, например, с помощью setters тогда будет отражено в обоих list.This неглубокая копия.

List <Ingredient> somelist = new ArrayList<>(ingredients); 
Ingredient aux=ingredients.get(0); 
aux.setSomeProperty("someProperty");//will be reflected in both list 

Чтобы сделать глубокую копию, вы должны добавить метод клонирования для вашего класса Ингредиент сделать глубокую копию.

+0

Список somelist = new ArrayList <> (components.size()) Я получаю java.lang.IndexOutOfBoundsException. Другой вариант изменяет оригинал – Pavel

+0

@Pavel i обновляет мой ответ, надеюсь, что это поможет, если вам нужна глубокая копия, вам нужно создать конструктор копирования или использовать клон правильно, но это не рекомендуется. – nachokk

0

Что вы делаете установки второй список будет ссылка на первый. То, что вы хотите сделать, - это как-то передать информацию от первой до второй. В противном случае, когда кто-то изменен, так же как и другой.

Смежные вопросы