Можно ли создать независимую копию целочисленного массива в Java?

Я пытался сделать это разными способами, однако, если я внесу какие-либо изменения в одну копию, эти изменения будут отражены в другой. Я также пытался глубокое копирование без результатов, пожалуйста, помогите.

Мой метод глубокого копирования:

public static ArrayList<Integer> cloneList(ArrayList<Integer> list) {
    ArrayList<Integer> clone = new ArrayList<Integer>(list.size());
    for (int i=0;i<list.size();i++){
        clone.add(list.get(i));
    }       
    return clone;
}

Маленькое изменение: это метод, используемый при внесении изменений в скопированный массив

public static ArrayList<Integer>smallChange(ArrayList<Integer>oldArray){
    int firstNo;
    int secondNo;

    do{
        Random rand1 = new Random();
        Random rand2 = new Random();
        firstNo = (int) Math.abs(matrix_length*rand1.nextDouble());
        System.out.println("A: "+firstNo);
        secondNo = (int) Math.abs(matrix_length*rand2.nextDouble());
        System.out.println("B: "+secondNo);

    }while(firstNo == secondNo);


    int temp1 = oldArray.indexOf(firstNo);
    int temp2 = oldArray.indexOf(secondNo);

    oldArray.set(temp1, secondNo);
    oldArray.set(temp2,firstNo);
    ArrayList<Integer> newArrayList = oldArray;             

    return newArrayList;        
}

4 ответа

Можно ли создать независимую копию списка целочисленных массивов в Java?

Вы могли бы просто сделать это:

public static ArrayList<Integer> cloneList(ArrayList<Integer> list) {
      return new ArrayList<Integer>(list);
}

Если я понимаю, что вы действительно пытаетесь сделать (создавая новый ArrayList со случайным небольшим изменением), проблема в том, что вы модифицируете исходный список, а затем клонируете его. Предполагая, что вот решение:

public static ArrayList<Integer> smallChange(ArrayList<Integer> oldArray) {
    int firstNo;
    int secondNo;

    do {
        Random rand1 = new Random();
        Random rand2 = new Random();
        firstNo = (int) Math.abs(matrix_length*rand1.nextDouble());
        System.out.println("A: "+firstNo);
        secondNo = (int) Math.abs(matrix_length*rand2.nextDouble());
        System.out.println("B: "+secondNo);

    } while(firstNo == secondNo);

    ArrayList<Integer> newArrayList = new ArrayList<>(oldArray);
    int temp1 = newArrayList.indexOf(firstNo);
    int temp2 = newArrayList.indexOf(secondNo);

    newArrayList.set(temp1, secondNo);
    newArrayList.set(temp2,firstNo);    
    return newArrayList;        
}

И вот пример того, как скопировать список, а затем изменить копию:

import java.util.*;

public class HelloWorld{

     public static void main(String []args){
        List<Integer> list1= new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        List<Integer> list2= new ArrayList<>(list1);
        list2.set(1,6);
        System.out.println(list1);
        System.out.println(list2);
     }
}

Попробуйте метод Collections.copy.

public static void copy(List dest, List src)

Вы можете использовать метод unmodifiableList класса Collections, который по крайней мере остановит изменение в объекте списка, который передается в качестве параметра в метод unmodifiableList класса Collections.

public List<String> getList(List<String> alist) {
        List<String> list = new ArrayList<String>(alist);
        List<String> unmodifiableList = Collections.unmodifiableList(list);

        return unmodifiableList;
    }
Другие вопросы по тегам