2014-10-03 2 views
13

Sto provando la ricerca sequenziale utilizzando gli stream Java 8 e le espressioni lambda. Qui è il mio codiceTrova tutti gli indici di un elemento all'interno di un elenco utilizzando l'API dello stream

List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7); 
int search = 16; 
list.stream().filter(p -> p == search).forEachOrdered(e -> System.out.println(list.indexOf(e))); 
Output: 2 
     2 

So list.indexOf(e) stampa sempre l'indice della prima occorrenza. Come posso stampare tutti gli indici?

+0

non credo che si può fare con questo tipo di struttura. Una volta filtrato, hai perso le informazioni dell'indice. Se dopo questo hai stampato indici, otterresti indici all'interno dell'elenco filtrato. –

+1

Possibile duplicato di http://stackoverflow.com/q/18552005/1407656 o http://stackoverflow.com/q/22793006/1407656 – toniedzwiedz

+0

@Tom cosa è la query nel post specificato. quando provo questo dando errore di compilazione alla query. – mallikarjun

risposta

25

Per cominciare, utilizzando lambda non è la soluzione a tutti i problemi ... ma, anche in questo caso, come per il ciclo, si potrebbe scrivere:

List<Integer> results = new ArrayList<>(); 
for (int i = 0; i < list.size(); i++) { 
    if (search == list.get(i).intValue()) { 
     // found value at index i 
     results.add(i); 
    } 
} 

Ora, non c'è niente di particolarmente sbagliato in questo , ma nota che l'aspetto critico qui è l'indice, non il valore. L'indice è l'input e l'output del 'loop'.

come un flusso ::

List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7); 
int search = 16; 
int[] indices = IntStream.range(0, list.size()) 
       .filter(i -> list.get(i) == search) 
       .toArray(); 
System.out.printf("Found %d at indices %s%n", search, Arrays.toString(indices)); 

produce un output:

Found 16 at indices [2, 5] 
+0

Esiste% n alla fine della funzione printf, tre subsitutes ma sono stati forniti due parametri? – Whome

+3

@Whome - il '% n' aggiunge un terminatore di riga specifico del sistema operativo (un' ben educato '\ n'). Non ha bisogno di un valore di sostituzione corrispondente. (Vedi "Line Separator [nella documentazione] (http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html)) – rolfl