Я предполагаю, что Id
, которые вы дали элементам, на самом деле являются идентификаторами, так что элементы с одинаковым идентификатором считаются равными, и что для каждого идентификатора имеется только один элемент.Затем вы можете использовать следующий код:
package so4483619;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class AddDel {
private static <K, V> HashMap<K, V> newLinkedHashMap() {
return new LinkedHashMap<K, V>();
}
private static <K, V> HashMap<K, V> newLinkedHashMap(Map<? extends K, ? extends V> other) {
return new LinkedHashMap<K, V>(other);
}
private static void computeDeleteAndAdd(List<? extends Item> before, List<? extends Item> after) {
Map<Long, Item> beforeById = newLinkedHashMap();
for (Item item : before) {
beforeById.put(item.getId(), item);
}
Map<Long, Item> afterById = newLinkedHashMap();
for (Item item : after) {
afterById.put(item.getId(), item);
}
Map<Long, Item> onlyBefore = newLinkedHashMap(beforeById);
onlyBefore.keySet().removeAll(afterById.keySet());
Map<Long, Item> onlyAfter = newLinkedHashMap(afterById);
onlyAfter.keySet().removeAll(beforeById.keySet());
for (Map.Entry<Long, Item> entry : onlyBefore.entrySet()) {
System.out.println("delete:" + entry.getKey());
}
for (Map.Entry<Long, Item> entry : onlyAfter.entrySet()) {
System.out.println("add:" + entry.getKey());
}
}
public static void main(String[] args) {
List<Item> beforeList = new ArrayList<Item>();
List<ItemEx> afterList = new ArrayList<ItemEx>();
beforeList.add(new Item(1L));
beforeList.add(new Item(2L)); // delete
beforeList.add(new Item(3L));
afterList.add(new ItemEx(1L));
afterList.add(new ItemEx(3L));
afterList.add(new ItemEx(4L));
computeDeleteAndAdd(beforeList, afterList);
}
}
Некоторые замечания:
-
LinkedHashMap
ведет себя как карта, но запоминает порядок, в котором элементы были вставлены.Это сделано для того, чтобы вывод был предсказуемым и имел тот же порядок, что и в beforeList
и afterList
. - Ваши классы
Item
и ItemEx
не имеют методов equals(Object)
и hashCode()
, поэтому их нельзя использовать непосредственно как ключи в HashMap
.Это мое предположение, что вы считаете, что два Item
с одинаковым идентификатором равны. - Два вспомогательных метода
newLinkedHashMap
просто сохраняют некоторые нажатия клавиш в методе computeDeleteAndAdd
.Без этих методов вы должны были бы сказать new LinkedHashMap<Long, Item>(...)
вместо простого newLinkedHashMap(...)
.