2013-09-06 1 views
0

Предположим, у меня есть два ArrayLists с оба имеют некоторые объекты в нем:Как убрать все, но что касается удвоений в Java?

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 
} 

«а» происходит в обоих списках дважды, «Ъ» один раз и «с» один раз.

Есть ли библиотека для этого или мне нужно написать ее самостоятельно? Если да, то как?

+1

Объясните более подробно, что это значит: относительно парных. – arjacsoh

+0

Является ли порядок элементов важным для вашего вопроса или это просто случайно, что вы используете 'List' вместо' Set'? – Holger

ответ

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

И это самый тривиальный способ сохранить мин залегания в два списка.

+0

Простое, но работающее решение с несколькими строками кода. Только то, что я искал. –

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

Конечно, вы должны настроить немного кода.

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