1

class Officer属性を持つ同じものに属する異なるサイズの2つのリストがあります:

Integer id;
Integer level; 
String role;

これら 2 つのリスト list1 と list2 を比較して、2 つの新しいリスト insertLst と deleteList を生成できるようにします。

list 1 と list2 の両方に固有の要素が含まれています。

insertLst : このリストには、list2 ではなく list1 の項目が含まれます。

deleteList : このリストには、list1 ではなく list2 の項目が含まれます。

org.apache.commons.collections.CollectionUtils API を使用している可能性があります。

これら 2 つのリスト insertLst と deleteList を生成するための Java コードを教えてください。

4

4 に答える 4

3

org.apache.commons.collections.CollectionUtils を使用する場合は、subtract メソッドを使用する必要があります。

Collection<Officer> insertList= CollectionUtils.subtract(list1, list2);
Collection<Officer> deleteList = CollectionUtils.subtract(list2, list1);

または、依存関係に別のライブラリを追加しないように、次のように記述することもできます (メソッドに入力された空のリストを渡します)。

static <T> void process(List<T> list1, List<T> list2, List<T> insertList, List<T> deleteList) {
    for (T t: list1) {
        if (!list2.contains(t)) {
            insertList.add(t);
        }
    }
    for (T t: list2) {
        if (!list1.contains(t)) {
            deleteList.add(t);
        }
    }
}

どちらの場合も、クラス Officer の equals メソッドと hashcode メソッドをオーバーライドすることを忘れないでください。解説はこちらをご覧ください

于 2013-06-06T11:34:39.297 に答える
1

クラスが(and ) メソッドをOfficerオーバーライドしていることを確認してください。これは非常に簡単です。equals()hashCode()

List<Officer> list1 = ... // your list1
List<Officer> list2 = ... // your list2
List<Officer> insertLst = new ArrayList<>(list1);
insertLst.removeAll(list2);
List<Officer> deleteList= new ArrayList<>(list2);
deleteList.removeAll(list1);
于 2013-06-06T11:09:05.810 に答える
0

2 つのリストをループする必要があります ....

これを行う1つの方法は次のとおりです。

ArrayList <Officer> list1= ....
ArrayList <Officer> list2= ....
ArrayList <Officer> insertList= new  ArrayList <Officer>();
ArrayList <Officer> deleteList= new  ArrayList <Officer>();

for(Officer x:list1){
  for(Officer y:list2){
     //business logic here
     if(x.id==y.id){
       insertList.add(x); //example code to add an Object in a List
     }
  }
}

ビジネス ロジックの部分はあなた次第です... 2 つのリストのデータを比較して、何がどこにあるのかを判断できます...

お役に立てれば

于 2013-06-06T11:12:19.387 に答える