1

我从数据库成分中获取了一个列表,然后创建了一个新列表 somelist = ingredinets。我用 convert(somelist) 转换 somelist 的一些值。这正在改变这两个列表。有没有办法保留原始清单成分?可能,我做错了什么。我应该从数据库中获取第二个列表吗?

    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;
}
4

3 回答 3

1

这一行:

somelist = ingredients;

不是复制ingredients,它的设置somelist与 相同ingredients

您可以简单地将所有元素添加ingredientssomelist

somelist.addAll(ingredients);

...但您似乎也在修改这些,并且 aList持有对元素的引用,而不是实际元素。因此,您需要更进一步并更深入地复制一个级别:

for (Ingredient ingr : ingredients) {
    somelist.add(new Ingredient(ingr)); // or use whatever constructor is appropriate.
}
于 2013-09-21T22:54:35.050 回答
0

如果您使用 anArrayList作为实现,somelist则可以使用此构造函数进行创建。

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

请注意,这是 List 的副本,如果您将一些元素添加到其中,ingredients则不会反映在someList其中,反之亦然。

例子:

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

但是如果你改变列表中的元素,例如通过,setters那么它将反映在两个列表中。这是一个浅拷贝。

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

要制作深拷贝,您必须为您的成分类添加一个克隆方法来制作深拷贝。

于 2013-09-21T22:53:49.260 回答
0

您正在做的是将第二个列表设置为对第一个列表的引用。你想要做的是以某种方式将信息从第一个传递到第二个。否则当一个被改变时,另一个也被改变。

于 2013-09-21T22:54:55.047 回答