Java 调用其他函数时,使对象的ArrayList复制非引用的值
我想调用另一个函数,但不想更改我的arraylist。但是当我每次调用函数时,我的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
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;
}