Можно ли создать независимую копию целочисленного массива в 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;
}