Допустим, у меня есть список A, который должен выглядеть точно так же, как список B. Все объекты, которые есть у B, но у A нет необходимости, должны быть добавлены к A. И все объекты, которые есть у A, но не B, должны быть удаленным из А.
Причина, по которой мне это нужно, заключается в том, что у меня есть ArrayList of Players, который я сохраняю в файл. Каждый раз, когда я обновляю атрибут Player, я сохраняю изменения в файле, вызывая метод, который просматривает ArrayList of Players и сохраняет его. Это работает, потому что ArrayList имеет ссылки на игроков.
Однако всякий раз, когда я ищу игрока в списке, я сначала обновляю список, читая файл, в котором он хранится. Это заменяет все ссылки совершенно новыми объектами. После того, как я сделаю это, если я внесу изменения в ранее загруженного пользователя и попытаюсь сохранить его. Новый экземпляр проигрывателя сохраняется вместо того, в котором я внес изменения.
Может ли придумать хороший алгоритм, чтобы сделать список равным другому решению? Или есть лучший способ обновить весь список, сохраняя ссылки там?
ОБНОВЛЕНИЕ: обновленное решение, выполняется за время O (nlogm). Перебирает каждый элемент в пункте назначения, ищет его в источнике. Если он найден, удален из источника. Если нет, удаляется из пункта назначения. Затем добавьте оставшиеся элементы в источнике к месту назначения. Конечно, список нужно отсортировать, но список, который я получаю из файла, будет уже отсортирован, потому что я сортирую по мере добавления.
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CopyList {
public static void copyList(List dest, List src) {
copy(dest, src);
// the remaining elements in src list will be those that were originally
// in src but not in dest and so they need to be added
dest.addAll(src);
}
public static void copyList(List dest, List src, Verify v) {
copy(dest, src);
// the remaining elements in src list will be those that were originally
// in src but not in dest and so they need to be added
addAll(dest, src, v);
}
public static void copyList(List dest, List src, Comparator c) {
copy(dest, src, c);
// the remaining elements in src list will be those that were originally
// in src but not in dest and so they need to be added
dest.addAll(src);
}
public static void copyList(List dest, List src, Comparator c, Verify v) {
copy(dest, src, c);
// the remaining elements in src list will be those that were originally
// in src but not in dest and so they need to be added
addAll(dest, src, v);
}
private static void copy(List dest, List src) {
// go through dest list to search if every element is in the new list
// travel backwards through dest because we will be removing elements from it
for(int i = dest.size()-1; i >= 0 ; i--) {
int src_i = Collections.binarySearch(src, dest.get(i));
if(src_i >= 0)
// if element is found in src list, remove it from src list
src.remove(src_i);
else
// if element is NOT found in src list, remove it from dest list
dest.remove(i);
}
}
private static void copy(List dest, List src, Comparator c) {
// go through dest list to search if every element is in the new list
// travel backwards through dest because elements might be removed
for(int i = dest.size()-1; i >= 0 ; i--) {
int src_i = Collections.binarySearch(src, dest.get(i), c);
if(src_i >= 0)
// if element is found in src list, remove it from src list
src.remove(src_i);
else
// if element is NOT found in src list, remove it from dest list
dest.remove(i);
}
}
private static void addAll(List dest, List src, Verify v) {
// verify each element in src list before adding it to dest list
for(Object o: src)
if(v.verify(o))
dest.add(o);
}
}