まず、「4462626」と同様の質問を投稿することについてお詫び申し上げます。私は2つのオブジェクト(親子関係です)と比較したいと思います。どのようにコードをフォローすると思いますか?あまりにも多くのfor-loopが存在するので効率的ではないと私は思う。私にアドバイスできますか? (注意:私はItem.classとItemEx.classはItem.classを拡張する必要があり、変更することは許されないのです)コレクションを追加または削除したかどうかを表示する方法は?
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;
}
}
'Item'が' equals'と 'hashCode'をオーバーライドしていることを確認してください。 – finnw
@finnw:優れた点。私はその前提を追加すべきだった。 –