如何保留所有,但关于Java中的双打?

时间:2013-09-06 10:40:15

标签: java arraylist

假设我有两个ArrayLists,其中都有一些对象:

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);

现在我想找到与另一个数组中的元素相交的元素,但是关于双精度。关于双打'我的意思是:如果列表1包含三次对象A,列表2包含两次对象A,则返回的数组将包含两次对象A,因为对象A在两个数组中至少出现两次。

所以我希望输出列表如下:

ArrayList {
    a,
    a,
    b,
    c
}

'一个'在两个列表中都会出现两次,' b'曾经和' c一次。

是否有用于执行此操作的库或是否必须自己编写?如果是,怎么样?

3 个答案:

答案 0 :(得分: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;
 }

这是在两个列表中保留最小值的最简单方法。

答案 1 :(得分:0)

我认为没有图书馆可以做到这一点。首先查找一个元素存在于一个列表中的时间:

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

然后对第二个列表执行相同的操作:

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);
    }
}

当然你必须稍微调整一下代码。

答案 2 :(得分: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);
         }