Это мой метод:
public boolean checkIfFriend(Coin coin){
ArrayList <int []> testCoordinates = new ArrayList <int[]>();
testCoordinates = this.coordinates; //I copy my ArrayList <Coin> "coordinates" into another ArrayList, "testCoordinates".
testCoordinates.retainAll(coin.getCoordinates()); //I remove all elements from "testCoordinates" that do not exist in the ArrayList supplied as argument.
if (testCoordinates.size() > 1){ //On this line, "this.coordinates" has been emptied for all elements. Why?
return true;
}
return false;
}
После того, как я вызываю "keepAll" -method, "this.coordinates" имеет в нем 0 элементов, тогда как раньше было 29.
Я подозреваю, что я, возможно, неправильно понял что-либо в объявлениях ArrayList или в файле preserveAll -method. Я не понимаю, почему "this.coordinates" опорожняется после того, как я вызываю "keepAll" -method.
Спасибо за помощь!
Ваш код не копирует список, а просто ссылается на оригинал. Чтобы скопировать, используйте метод addAll для testCoordinates (или соответствующего конструктора) вместо того, чтобы назначать его this.coordinates
ArrayList <int []> testCoordinates = new ArrayList <int[]>(this.coordinates);
testCoordinates.retainAll(...);
Эта строка не создает копию ArrayList
.
testCoordinates = this.coordinates;
Он назначает testCoordinates
ссылаться на тот же объект, на который ссылается this.coordinates
. У вас есть две переменные, относящиеся к одному и тому же объекту, поэтому операции по любой ссылке влияют на один и тот же объект. Таким образом, опуская ArrayList
через retainAll
влияет только на объект ArrayList
, и изменения видны через обе ссылки на него.
Чтобы сделать копию, вы должны создать новый объект. Замените это:
testCoordinates = this.coordinates;
с этим:
testCoordinates = new ArrayList<int[]>(this.coordinates);