Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用其他函数时,使对象的ArrayList复制非引用的值_Java_Arraylist_Collections_Clone - Fatal编程技术网

Java 调用其他函数时,使对象的ArrayList复制非引用的值

Java 调用其他函数时,使对象的ArrayList复制非引用的值,java,arraylist,collections,clone,Java,Arraylist,Collections,Clone,我想调用另一个函数,但不想更改我的arraylist。但是当我每次调用函数时,我的arraylist都会改变。 以下是我的代码片段: private ArrayList<LeftPanelObject> addAllNestingGroup(LinkedHashMap<String, ArrayList<LeftPanelObject>> rowGroupDataNesting) { ArrayList<LeftPanelObject> l

我想调用另一个函数,但不想更改我的arraylist。但是当我每次调用函数时,我的arraylist都会改变。 以下是我的代码片段:

private ArrayList<LeftPanelObject> addAllNestingGroup(LinkedHashMap<String, ArrayList<LeftPanelObject>> rowGroupDataNesting) {
    ArrayList<LeftPanelObject> l1= new ArrayList<>();
    LeftPanelObject obj= new LeftPanelObject();
    for(String key:rowGroupDataNesting.keySet()){
        ArrayList<LeftPanelObject> rowData= new ArrayList<LeftPanelObject>();
        ArrayList<LeftPanelObject> rowDataB= new ArrayList<LeftPanelObject>();
        rowDataB=(ArrayList<LeftPanelObject>) rowGroupDataNesting.get(key).clone();
        rowData.addAll(rowDataB);
        obj=getNestingOfObj(obj,rowData,rowData.size(),rowData.size());
        }
    l1.add(obj);
    return l1;
}
//我在这里改变结构 //leftpanelObject是我的基本对象,包含它自己对N层嵌套的引用

private LeftPanelObject getNestingOfObj(LeftPanelObject obj,
            final ArrayList<LeftPanelObject> rowData1,int size,int actualSize) {

    ArrayList<LeftPanelObject> rowData=new ArrayList<LeftPanelObject>(rowData1);
    int i=actualSize-size;
    if(i<actualSize){
        if(i==0){
            obj=rowData.get(i); 
            obj=getNestingOfObj(obj,(ArrayList<LeftPanelObject>) rowData.clone(),size-1,actualSize);
        }else{
            if(obj.getLevel()==null){
                obj.setGroupId(-1);
                obj.setRowId(-1);
                obj.setNestingLevel(-1);
                ArrayList<LeftPanelObject> temp=new ArrayList<>();
                temp.add(getNestingOfObj(rowData.get(i),(ArrayList<LeftPanelObject>) rowData.clone(),size-1,actualSize));
                obj.setLevel(temp);
            }else if(obj.getLevel().isEmpty()){
                obj.setGroupId(-1);
                obj.setRowId(-1);
                obj.setNestingLevel(-1);
                ArrayList<LeftPanelObject> temp=new ArrayList<>();
                temp.add(getNestingOfObj(rowData.get(i),(ArrayList<LeftPanelObject>) rowData.clone(),size-1,actualSize));
                obj.setLevel(temp);
            }else{
                for(int j=0;j<obj.getLevel().size();j++)
                getNestingOfObj(obj.getLevel().get(j),(ArrayList<LeftPanelObject>) rowData.clone(),size,actualSize);
            }
        }
    }else{
        return obj;
    }
    return obj;

}

您只需要为getNestingOfObj方法提供一个新的ArrayList实例

getNestingOfObj(
     obj, 
     new ArrayList<>(rowData),
     rowData.size(),
     rowData.size()
);
ArrayList类提供了一个接受集合的构造函数


我重写了实体类LeftPanelObject的克隆函数,它成功了

public Object clone() throws CloneNotSupportedException{
    LeftPanelObject cloneObj = new LeftPanelObject();
    cloneObj.setCode(this.code);
    if(this.columnData==null){
        cloneObj.setColumnData(this.columnData);
    }else{
        ArrayList<ResultSetEntity> list= new ArrayList<ResultSetEntity>();
        for(ResultSetEntity listObj:this.columnData){
            list.add((ResultSetEntity) listObj.clone());
        }
        cloneObj.setColumnData(list);
    }
    cloneObj.setGroupId(this.groupId);
    if(this.level==null){
        cloneObj.setLevel(this.level);
    }else{
        ArrayList<LeftPanelObject> list= new ArrayList<LeftPanelObject>();
        for(LeftPanelObject objList:this.level){
            list.add((LeftPanelObject) objList.clone());
        }
        cloneObj.setLevel(list);
    }
    //cloneObj.setLevel(this.level==null?this.level:(ArrayList<LeftPanelObject>) this.level.clone());
    cloneObj.setName(this.name);
    cloneObj.setNestingLevel(this.nestingLevel);
    cloneObj.setRowId(this.rowId);
    cloneObj.setType(this.type);
    return cloneObj;

}

您好,谢谢您的建议,我也试过了,但还是没有用。@shridhar您能发布getNestingOfObj的完整代码吗?@shridhar您的意思是您不想修改rowData列表吗?或者你不想修改元素?我找到了解决方案,我覆盖了实体类的clone方法,它工作了;在循环中调用同一函数时,不希望再次修改rowGroupDataNesting
public Object clone() throws CloneNotSupportedException{
    LeftPanelObject cloneObj = new LeftPanelObject();
    cloneObj.setCode(this.code);
    if(this.columnData==null){
        cloneObj.setColumnData(this.columnData);
    }else{
        ArrayList<ResultSetEntity> list= new ArrayList<ResultSetEntity>();
        for(ResultSetEntity listObj:this.columnData){
            list.add((ResultSetEntity) listObj.clone());
        }
        cloneObj.setColumnData(list);
    }
    cloneObj.setGroupId(this.groupId);
    if(this.level==null){
        cloneObj.setLevel(this.level);
    }else{
        ArrayList<LeftPanelObject> list= new ArrayList<LeftPanelObject>();
        for(LeftPanelObject objList:this.level){
            list.add((LeftPanelObject) objList.clone());
        }
        cloneObj.setLevel(list);
    }
    //cloneObj.setLevel(this.level==null?this.level:(ArrayList<LeftPanelObject>) this.level.clone());
    cloneObj.setName(this.name);
    cloneObj.setNestingLevel(this.nestingLevel);
    cloneObj.setRowId(this.rowId);
    cloneObj.setType(this.type);
    return cloneObj;

}