2013-03-03 7 views
8

Ho una lista di array interi. Ho bisogno di trovare gli elementi comuni tra quelli. Quello che mi viene in mente è un'estensione di ciò che è elencato in Common elements in two listsC'è un modo per trovare elementi comuni in più elenchi?

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

should result in [1,3] 

ci sono duplicati nelle matrici così.

C'è un modo semplice per farlo?

+0

Stai cercando di intersecare i valori di un elenco di array int? Cosa intendi per "modo diretto"? –

+0

"Comune" che significa che appaiono in * ogni * lista, o in * più di una * lista? – NPE

+0

Intendevo per "modo diretto" un metodo in una sorta di libreria come apache commons, colt, guava ecc. – ravindrab

risposta

14

È possibile trasformare le liste ai set, e quindi utilizzare metodo per intersezione tra i diversi set. Una volta intersecati tutti i set, vi rimangono gli elementi comuni e potete trasformare il set risultante in un elenco.

+0

true, ma il mio requisito è ottenere gli elementi comuni per più elenchi – ravindrab

+2

È ancora conforme ai tuoi requisiti - puoi trasformare ogni lista in un Set (un HashSet può prendere una Collection come argomento costruttore) , fai l'intersezione e trasforma il set intersecato in lista. Questa soluzione è O (n), mentre l'ordinamento di ciascun elenco e il confronto è O (n * log (n)) e il confronto di ciascun elemento con altri elementi è O (n^2). –

+2

La conversione di @AmirKost in un 'Set' (che non è un' LinkedHashSet') perderà l'ordine della lista. – wchargin

1

Se siete alla ricerca di una funzione che restituisce gli elementi che esistono in tutte le liste,

allora il modo semplice & semplice sta costruendo una statistica {< membro, avvenimenti>}

La condizione qui è duplicati tra la stessa lista,

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

A differenza di C#, in Java non è possibile specificare una primitiva come tipo generico. Quindi, invece di 'Set ', usa 'Imposta '. –

+0

Grazie per le informazioni, Fouad –

8

È possibile utilizzare il metodo di intersezione del set offerto da Guava, Ecco un piccolo esempio:

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

speranza che potrebbe aiutare a

+0

questo mi ha aiutato molto grazie per la soluzione. Mi chiedo perché questo non è accettabile, comunque grazie –

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

Possiamo usare retainAll method of Collections. Ho inizializzato il mio arrayylist commons con il primo elenco di array e lo ho chiamato per ogni arraylist rimanente.

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