Java列表默认和修改列表

Java列表默认和修改列表,java,Java,我从数据库成分中获取一个列表,并创建一个新列表somelist=ingredinets。我用convert(somelist)转换somelist的一些值。这将改变两个列表。有没有办法保留原来的配料表?也许,我做错了什么。我应该从数据库中获取第二个列表吗 List <Ingredient> somelist = new ArrayList<>(); somelist = ingredients; convert.showImperial(some

我从数据库成分中获取一个列表,并创建一个新列表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;
}
List-somelist=new-ArrayList();
somelist=成分;
convert.showImperial(somelist);
公共列表(列出成分){
对于(int i=0;i=453.59237){
值=值/453.59237;
BigDecimal四舍五入=新的BigDecimal(值);
四舍五入=四舍五入。设置刻度(2,四舍五入模式。半向下);
components.get(i).setValue((四舍五入.doubleValue());//到磅
成分。获取(i)。设定测量值(磅);
}否则{
value=value*16/453.59237;//到盎司;
系统输出打印项次(值);
BigDecimal四舍五入=新的BigDecimal(值);
舍入=舍入。设置刻度(1,舍入模式。半向下);
//系统输出打印项次(四舍五入);
//System.out.println(四舍五入的.doubleValue());
配料.get(i).setValue(四舍五入.doubleValue());
成分。获取(i)。设定测量值(盎司);
}
打破
}
案例ML:{
double value=配料.get(i).getValue();
成分。获取(i)设定值(值/240);
配料。获取(i)。设置测量(杯);//到杯
打破
}
默认值:{
打破
}
}
}
返回成分;
}

如果在
somelist
中使用
ArrayList
作为实现,则可以使用此构造函数创建

   List <Ingredient> somelist = new ArrayList<>(ingredients);
但是,如果您通过
setters
等方式对列表中的元素进行变异,那么它将反映在两个列表中。这是一个浅拷贝

List <Ingredient> somelist = new ArrayList<>(ingredients);
Ingredient aux=ingredients.get(0); 
aux.setSomeProperty("someProperty");//will be reflected in both list
List-somelist=new-ArrayList(配料);
配料辅助=配料。获取(0);
辅助设置someProperty(“someProperty”)//将反映在两个列表中

要进行深度复制,必须为成分类添加克隆方法以进行深度复制。

如果在
somelist
中使用
ArrayList
作为实现,则可以使用此构造函数创建

   List <Ingredient> somelist = new ArrayList<>(ingredients);
但是,如果您通过
setters
等方式对列表中的元素进行变异,那么它将反映在两个列表中。这是一个浅拷贝

List <Ingredient> somelist = new ArrayList<>(ingredients);
Ingredient aux=ingredients.get(0); 
aux.setSomeProperty("someProperty");//will be reflected in both list
List-somelist=new-ArrayList(配料);
配料辅助=配料。获取(0);
辅助设置someProperty(“someProperty”)//将反映在两个列表中
要制作深度复制,必须为成分类添加克隆方法以制作深度复制。

此行:

somelist = ingredients;
不是复制
成分
,而是将
某些列表
设置为与
成分
相同

您只需将
成分
中的所有元素添加到
somelist

somelist.addAll(ingredients);
…但您似乎也在修改这些元素,并且一个
列表
包含对元素的引用,而不是对实际元素的引用。因此,您需要更进一步,复制更深一层:

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

somelist = ingredients;
不是复制
成分
,而是将
某些列表
设置为与
成分
相同

您只需将
成分
中的所有元素添加到
somelist

somelist.addAll(ingredients);
…但您似乎也在修改这些元素,并且一个
列表
包含对元素的引用,而不是对实际元素的引用。因此,您需要更进一步,复制更深一层:

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

您要做的是将第二个列表设置为第一个列表的引用。您要做的是以某种方式将信息从第一个传递到第二个。否则,当一个发生变化时,另一个也会发生变化

您要做的是将第二个列表设置为第一个列表的引用。您要做的是以某种方式将信息从第一个传递到第二个。否则,当一个发生变化时,另一个也会发生变化

List somelist=newarraylist(components.size())我得到java.lang.IndexOutOfBoundsException。另一个选项是修改original@Pavel我更新了我的答案,希望它能帮助你,如果你需要深度复制,你必须创建一个复制构造函数,或者以适当的方式使用克隆,但不推荐使用。List somelist=new ArrayList(components.size())我得到java.lang.IndexOutOfBoundsException。另一个选项是修改original@Pavel我更新了我的答案,希望它能帮助你,如果你需要深度复制,你必须创建一个复制构造函数,或者以一种合适的方式使用克隆,但不推荐这样做。