4

メソッドremoveAll、retainAll、containsを使用するなど、一括操作を実行したい2つのリストがあります。問題は、両方のリストに同じフィールドを持つ異なるタイプのオブジェクトがあることです。そのような

class ObjectType1{
  Long field1;
  String field2;
  String field3
 }

class ObjectType2{
Long field1;
String field4;
Long field5

}

したがって、list1 には ObjectType1 の要素が含まれ、list2 には ObjectType2 が含まれます。両方のオブジェクト タイプに共通する field1 に基づいて一括操作を実行したいと考えています。

共通のフィールドに基づいて、両方のオブジェクトに equals メソッドを実装することを考えていました。しかし、将来、equals メソッドで他のフィールドに基づく比較を追加する必要があるかもしれないので、1 つのフィールドだけで equals を作成するのは間違っているかもしれないと考えました。提案してください。

質問が十分に明確になったことを願っています。明確にするために私に知らせてください。

4

5 に答える 5

1

Google の Guava ライブラリをご覧ください。これを達成するために使用できますCollections2.transformretainAll()たとえば、次のようにします。

import com.google.common.base.Function;
import com.google.common.collect.Collections2;
...
List<ObjectType1> list1 = ...;
List<ObjectType2> list2 = ...;
Colection<Long> list1field1 = 
  Collections2.transform(list1, 
                         new Function<ObjectType1, Long>() {
                           public Long apply(ObjectType1 input) {
                             return (null == input) ? null : input.field1;
                           }
                         });
Collection<Long> list2field1 = 
  Collections2.transform(list2, ...);

// list1.retainAll(list2) based on field1 equivalence
list1field1.retainAll(list2field1); // this affects the underlying list, ie list1.
于 2013-02-13T07:48:42.330 に答える
0

以下のコードを試してみてください。一般的な値のリストが表示されます

package rais;

import java.util.ArrayList;
import java.util.List;

public class ArrayClient {

    public static void main(String[] args) {

        List<ObjectType1> list1 = new ArrayList<ObjectType1>();

        ObjectType1 type1Obj1 = new ObjectType1(10001l, "XXX", "YYYY");
        list1.add(type1Obj1);

        ObjectType1 type1Obj2 = new ObjectType1(10002l, "XXX", "YYYY");
        list1.add(type1Obj2);

        ObjectType1 type1Obj3 = new ObjectType1(10003l, "XXX", "YYYY");
        list1.add(type1Obj3);

        ObjectType1 type1Obj4 = new ObjectType1(10004l, "XXX", "YYYY");
        list1.add(type1Obj4);

        ObjectType1 type1Obj5 = new ObjectType1(10005l, "XXX", "YYYY");
        list1.add(type1Obj5);

        List<ObjectType2> list2 = new ArrayList<ObjectType2>();

        ObjectType2 type2Obj1 = new ObjectType2(10001l, "XXX", 2000l);
        list2.add(type2Obj1);

        ObjectType2 type2Obj2 = new ObjectType2(10002l, "XXX", 2001l);
        list2.add(type2Obj2);

        ObjectType2 type2Obj3 = new ObjectType2(50002l, "XXX", 2002l);
        list2.add(type2Obj3);

        ObjectType2 type2Obj4 = new ObjectType2(50003l, "XXX", 2003l);
        list2.add(type2Obj4);

        List<ObjectType1> list3 = retainAll(list1, list2);

        for (ObjectType1 objectType : list3) {
            System.out.println(objectType);
        }

    }

    public static List<ObjectType1> retainAll(List<ObjectType1> firstList,  List<ObjectType2> secondList) {

        List<ObjectType1> list3 = new ArrayList<ObjectType1>();

        for (ObjectType1 first : firstList) {
            for (ObjectType2 second : secondList) {
                if (first.getField1().equals(second.getField1())) {
                    list3.add(first);
                    break;
                }

            }

        }

        return list3;

    }

}

上記のプログラムでは、2つのオブジェクトの下にあります

ObjectType1 type1Obj1 = new ObjectType1(10001l, "XXX", "YYYY");
            list1.add(type1Obj1);

            ObjectType1 type1Obj2 = new ObjectType1(10002l, "XXX", "YYYY");
            list1.add(type1Obj2);

両方のクラスに共通のfield1があるlist3 には、type1の2つの要素のみが含まれます。

于 2013-02-13T06:38:15.957 に答える
0

@Dilum が書いているように、Google の Guava ライブラリを使用できます。
さらに、リストのみがある場合は、Lists.transform代わりに使用する必要があります。
さらに、Java 8 を使用すると、次のようになります。

List<Long> list1field1 =
    Lists.transform(list1, input -> input == null ? null : input.field1);

または、手動で行うこともできます。

// list1.removeAll(list2);
Set<Long> set = new HashSet<Long>();
for (ObjectType2 o2 : list2) {
    set.add(o2.field1);
}
Iterator<ObjectType1> i = list1.iterator();
while (i.hasNext()) {
    if (set.contains(i.next().field1)) {
        i.remove();
    }
}
于 2014-09-25T13:10:39.253 に答える
0

私があなたの質問を正しく理解していれば、あなたは次のようなものが欲しい

    class SuperObject{
        Long field1;
        public SuperObject(){}
        public void setField1(Long f){
            field1 = f;
        }
        public Long getField1(){
            return field1;
        }
        public boolean equals(Object obj){
    if(obj instanceof SuperObject)
        return field1.equals(((SuperObject) obj).getField1());
    else
        return false;
}
    }
    class ObjectType1 extends SuperObject{
        String field2;
        String field3;
        ...    
}

    class ObjectType2 extends SuperObject{
        String field4;
        Long field5;
        ...
    }

リストは次のようになります

List<SuperObject> list = new ArrayList<SuperObject>();
    ObjectType1 obj1 = new ObjectType1();
    ObjectType2 obj2 = new ObjectType2();
    list.add(obj1);
    list.add(obj2);

field1リスト内のオブジェクトは、スーパークラスにあるに基づいて、同じ equal メソッドの実装を持つようになりました

于 2013-02-13T06:53:41.190 に答える