Сделайте ArrayList объекта скопировать значение не ссылка при вызове другой функции - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу вызвать другую функцию и не хочу менять мой список.Но когда я вызываю функцию каждый раз, когда мой массив меняется.Вот мой фрагмент кода:

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;

}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

я переопределяю функцию клона класса сущностей 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;

}
0 голосов
/ 19 февраля 2019

Вам просто нужно предоставить вашему методу getNestingOfObj новый экземпляр ArrayList<LeftPanelObject>.

getNestingOfObj(
     obj, 
     new ArrayList<>(rowData),
     rowData.size(),
     rowData.size()
);

Класс ArrayList<T> предлагает конструктор, который принимает Collection<T>

public ArrayList(Collection<? extends E> c) { ... }
...