0

2 つの ArrayList があり、両方にいくつかのオブジェクトが含まれているとします。

Object a = new Object();
Object b = new Object();
Object c = new Object();
Object d = new Object();

ArrayList list1 = new ArrayList();
list1.add(a);
list1.add(a);
list1.add(a);
list1.add(b);
list1.add(b);
list1.add(c);
ArrayList list2 = new ArrayList();
list2.add(a);
list2.add(a);
list2.add(b);
list2.add(c);
list2.add(c);
list2.add(d);

ArrayList output = retainAllButRegardingDoubles(list1, list2);

ここで、他の配列の要素と交差する要素を見つけたいと思いますが、doubles に関してです。「倍精度について」とは、つまり、リスト 1 にオブジェクト A が 3 回含まれ、リスト 2 にオブジェクト A が 2 回含まれている場合、オブジェクト A が両方の配列で少なくとも 2 回出現するため、返される配列にはオブジェクト A が 2 回含まれることになります。

したがって、出力リストは次のようになります。

ArrayList {
    a,
    a,
    b,
    c
}

'a' は両方のリストで 2 回、'b' は 1 回、'c' は 1 回出現します。

それを行うためのライブラリはありますか、それとも自分で書く必要がありますか? はいの場合、どのように?

4

5 に答える 5

1

この特定の操作に対するライブラリのサポートはないと思います。

この操作を実行する時点で、次の方法があります。

List retainAllButRegardingDoubles(list1, list2){

  ArrayList<Object> result = new ArrayList();

  for (Object 0:list1){
     int count1=Collections.frequency(list1, o);
     int count2=Collections.frequency(list2, o);
     int iMin=Math.min(count1,count2);
        for(int i=iMin;i>0;i--){
            result.add(o);
        }
    }
  return result;
 }

そして、これは 2 つのリストに最小の出現回数を保持する最も簡単な方法です。

于 2013-09-06T11:26:25.693 に答える
0

これを行うライブラリはないと思います。要素が1つのリストに存在する時間を最初に見つける:

int times1;
for (Object o: list1) {
    if (o.equals(a)) {
        times1++;
    }
}

次に、2 番目のリストに対して同じ操作を行います。

int times2;
for (Object o: list1) {
    if (o.equals(a)) {
        times2++;
    }
}

if (min(times1, times2) > 0) {
    int times = min(times1, times2);
    for (int i = 0; i < times; i++) {
        list.add(a);
    }
}

もちろん、コードを少し調整する必要があります。

于 2013-09-06T10:48:26.110 に答える
0
         List<String> list1 = new ArrayList<String>();
         list1.add("object1");
         list1.add("object1");
         list1.add("object3");
         list1.add("object5");
         list1.add("object10");

         List<String> list2 = new ArrayList<String>();
         list2.add("object1");
         list2.add("object1");
         list2.add("object2");
         list2.add("object6");
         list2.add("object10");

         List<String> list3 = new ArrayList<String>();
         list3.add("object1");
         list3.add("object1");
         list3.add("object3");
         list3.add("object7");
         list3.add("object10");

         List<String> list4 = new ArrayList<String>();
         list4.add("object1");
         list4.add("object1");
         list4.add("object2");
         list4.add("object8");  
         list4.add("object10");

         Collection<List<String>> collection = new ArrayList<List<String>>();
         collection.add(list1);
         collection.add(list2);
         collection.add(list3);
         collection.add(list4);

         List<String> result = new ArrayList<String>();
         result =((ArrayList<List<String>>) collection).get(0);

         for (int i=1;i< collection.size(); i++) {           
            result.retainAll(((ArrayList<List<String>>) collection).get(i));            
         }      


         for(String s:result){
             System.out.println(s);
         }
于 2013-09-06T10:54:47.730 に答える