Erstens, ich entschuldige mich dafür, eine ähnliche Frage zu "4462626" zu stellen. Ich möchte mit zwei Objekten (die Eltern-Kind-Beziehung sind) vergleichen. Wie denkst du, folgenden Code? Ich denke, es ist nicht effizient, weil zu viele for-Schleifen existieren. Kannst du mich beraten? (Beachten Sie: Ich bin nicht Item.class zu modifizieren erlaubt und ItemEx.class müssen Item.class verlängern)Wie wird angezeigt, ob eine Sammlung hinzugefügt oder gelöscht wurde?
EXPECTED RESULT
------------------------
add:4
delete:2
------------------------
package com.javastudy;
import java.util.ArrayList;
import java.util.List;
public class CollectionCompareToObjectsForLoop {
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)); // added
// Check Add
List<Item> addList = new ArrayList<Item>();
for(Item afterItem : afterList){
if(checkAdd(afterItem, beforeList)){
addList.add(afterItem);
}
}
// Check Delete
List<Item> deleteList = new ArrayList<Item>();
for(Item beforeItem : beforeList){
if(checkDelete(beforeItem, afterList)){
deleteList.add(beforeItem);
}
}
// Print Result
for(Item item : addList){
System.out.println("add:" + item.getId());
}
for(Item item : deleteList){
System.out.println("delete:" + item.getId());
}
}
private static boolean checkAdd(Item afterItem, List<Item> beforeList) {
for(Item beforeItem : beforeList){
if (afterItem.getId().equals(beforeItem.getId())){
return false;
}
}
return true;
}
private static boolean checkDelete(Item beforeItem, List<ItemEx> afterList) {
for(Item afterItem : afterList){
if (beforeItem.getId().equals(afterItem.getId())){
return false;
}
}
return true;
}
}
package com.javastudy;
public class Item {
private Long id;
public Item(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
package com.javastudy;
public class ItemEx extends Item {
private String name;
public ItemEx(Long id) {
super(id);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Stellen Sie sicher, dass 'Item' die Parameter' equals' und 'hashCode' überschreibt. – finnw
@finnw: ausgezeichneter Punkt. Ich hätte diese Annahme hinzufügen sollen. –