0

假设我有两个 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);

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

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

ArrayList {
    a,
    a,
    b,
    c
}

“a”在两个列表中出现两次,“b”一次,“c”一次。

有没有图书馆可以做到这一点,还是我必须自己写?如果是,如何?

4

5 回答 5

1

试试这个:

private static ArrayList retainAllButRegardingDoubles(ArrayList list1, ArrayList list2) {
        //Remove duplicates and get each object only once to improve performance
        Set<?> set1 = new HashSet(list1);
        Set<?> set2 = new HashSet(list2);

        ArrayList<Object> result = new ArrayList();

        for (Object o : set1){
            //You're adding to the result each element that appears twice at least in list1
            if (Collections.frequency(list1, o) > 1){
                result.add(o);
            }
        }
        for (Object o : set2){
            //You're adding to the result each element that appears twice at least in list2
            if (Collections.frequency(list2, o) > 1){
                result.add(o);
            }
        }
        return result;
    }
于 2013-09-06T10:47:06.297 回答
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;
 }

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

于 2013-09-06T11:26:25.693 回答
0

您可以遍历第一个列表,每次从第二个列表中找到与某个对象匹配时,从第二个列表中删除找到的对象。

public List<Object> retainAllButRegardingDoubles(List<Object> list1, List<Object> list2) {
   List<Object> result = new ArrayList<Object>();
   for (Object o : list1) {
      if (list2.contains(o)) {
         result.add(o);
         list2.remove(o);
      }
   }
   return result;
}
于 2013-09-06T10:46:56.233 回答
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);
    }
}

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

于 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 回答