2013-03-03 18 views
8

У меня есть список целых массивов. Мне нужно найти общие элементы между ними. То, что я могу думать является продолжением того, что перечислено в Common elements in two listsЕсть ли способ найти общие элементы в нескольких списках?

Example would be 
[1,3,5], 
[1,6,7,9,3], 
[1,3,10,11] 

should result in [1,3] 

Там нет дубликатов в массивах, а также.

Есть ли прямой способ сделать это?

+0

Вы пытаетесь пересечь значения списка массивов int? Что вы подразумеваете под «прямым путем»? –

+0

«Общий» означает, что они отображаются в * каждом * списке или в * более одного * списка? – NPE

+0

Я имел в виду «прямой путь» метод в какой-то библиотеке, такой как apache commons, colt, guava и т. Д. – ravindrab

ответ

14

Вы можете преобразовать списки наборов, а затем использовать метод пересечения между различными наборами. Как только вы пересечете все наборы, вы остаетесь с общими элементами, и вы можете преобразовать полученный набор обратно в список.

+0

true, но мое требование состоит в том, чтобы получить общие элементы для нескольких списков. – ravindrab

+2

Он по-прежнему соответствует вашим требованиям - вы можете преобразовать каждый список в Set (HashSet может принимать коллекцию как аргумент конструктора) , выполните пересечение и преобразуем пересеченное множество обратно в список. Это решение - O (n), тогда как сортировка каждого списка и сравнение - O (n * log (n)), а сравнение каждого элемента с другими элементами - O (n^2). –

+2

@ Преобразование AmirKost в 'Set' (это не' LinkedHashSet') потеряет порядок списка. – wchargin

1

Если вы ищете функцию, которая возвращает элементы, которые существуют во всех списках,

тогда прямого & простого пути построение статистики {< члена, вхождения>}

условия здесь является нет дубликатов среди того же списка,

private Set<Integer> getCommonElements(ArrayList<Integer[]> idList) 
{ 

    MapList<Integer,Short> stat = new MapList<Integer,Short>(); 

    // Here we count how many times each value occur 
    for (int i = 0; i < idList.size(); i++) 
    { 
     for (int j = 0; j < idList.get(i).size; j++) 
     { 
      if (stat.containsKey(idList.get(i)[j])) 
      { 
       stat.set(idList.get(i)[j], stat.get(idList.get(i)[j])+1); 
      } 
      else 
      { 
       stat.add(idList.get(i)[j], 1); 
      } 
     } 
    } 

    // Here we only keep value that occured in all lists 
    for (int i = 0; i < stat.size(); i++) 
    { 
     if (stat.get(i) < idList.size()) 
     { 
      stat.remove(i); 
      i--; 
     } 
    } 

    return stat.keySet(); 
} 
+1

В отличие от C#, в Java вы не можете указать примитив как общий тип. Поэтому вместо 'Set ' используйте 'Set '. –

+0

Спасибо за информацию, Fouad –

8

Вы можете использовать метод пересечения Сета предложенный Guava, Вот небольшой пример:

public <T> Set<T> intersection(List<T>... list) { 
    Set<T> result = Sets.newHashSet(list[0]); 
    for (List<T> numbers : list) { 
     result = Sets.intersection(result, Sets.newHashSet(numbers)); 
    } 
    return result; 
} 

Надежда, которая может помочь вам

+0

это очень помогло мне в решении. Интересно, почему это не приемлемо, так или иначе спасибо –

0
public class ArrayListImpl{ 
    public static void main(String s[]){ 
    ArrayList<Integer> al1=new ArrayList<Integer>(); 
    al1.add(21);al1.add(23);al1.add(25);al1.add(26); 
    ArrayList<Integer> al2=new ArrayList<Integer>(); 
    al2.add(15);al2.add(16);al2.add(23);al2.add(25); 
    ArrayList Al3=new ArrayList<Integer>(); 
    al3.addAll(al1); 
     System.out.println("Al3 Elements :"+al3); 
    al3.retainAll(al2); //Keeps common elements of (al1 & al2) & removes remaining elements 
     System.out.println("Common Elements Between Two Array List:"+al3); 
} 
} 
4

Мы можем использовать retainAll method of Collections. Я инициализировал мой arraylist commons первым списком массивов и назвал это для каждого оставшегося arraylists.

List<List<Integer>> lists = new ArrayList<List<Integer>>(); 
    lists.add(new ArrayList<Integer>(Arrays.asList(1, 3, 5))); 
    lists.add(new ArrayList<Integer>(Arrays.asList(1, 6, 7, 9, 3))); 
    lists.add(new ArrayList<Integer>(Arrays.asList(1, 3, 10, 11))); 

    List<Integer> commons = new ArrayList<Integer>(); 
    commons.addAll(lists.get(1)); 
    for (ListIterator<List<Integer>> iter = lists.listIterator(1); iter.hasNext();) { 
     commons.retainAll(iter.next()); 
    } 

    System.out.println(commons); 
    System.out.println(lists.get(1)); 
Смежные вопросы