假设我有两个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一次。
是否有用于执行此操作的库或是否必须自己编写?如果是,怎么样?
答案 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);
}