2013-08-04 14 views
5

Possiamo usare il vecchio ciclo for (for(i = 0, j = 0; i<30; i++,j++)) con due variabili Possiamo usare la for-each loop (o migliorato per ciclo) in java (for(Item item : items) con due variabili? Qual è la sintassi per questo?È possibile utilizzare il nuovo ciclo for in Java con due variabili?

+4

non è una 'nuova per loop', è fondamentalmente un ciclo foreach. Non puoi – MightyPork

+1

@ MightyPork È * migliorato per loop *. –

+0

come cambia il nome è scopo e uso? è equivalente al ciclo foreach. – MightyPork

risposta

7

Purtroppo, Java supporta solo un rudimentale foreach ciclo, chiamato migliorato per ciclo. Altre lingue, in particolare FP come Scala, supportano un costrutto noto come comprensivo di lista (Scala lo chiama per la comprensione) che consente le iterazioni nidificate, oltre al filtraggio degli elementi lungo il percorso.

9

No non si può. E 'zucchero sintattico per l'utilizzo di Iterator. Suggerire here per una buona risposta su questo tema.

è necessario disporre di un oggetto che contiene entrambe le variabili.

si può essere visualizzata sulla mappa un oggetto per esempio

for (Map.Entry<String,String> e: map.entrySet()) { 
    // you can use e.getKey() and e.getValue() here 
} 
+0

'Map' non implementa' Iterable'. – BalusC

+0

Certo, grazie mille! Corretto il mio esempio – Tala

+0

L'entryset fa. – arynaq

1

Il ciclo foreach presuppone che vi sia una sola raccolta di elementi. Puoi fare qualcosa per ogni elemento per iterazione. Come vorresti che si comportasse così se tu potessi scorrere su due raccolte contemporaneamente? Cosa succede se hanno lunghezze diverse?

Supponendo di avere

Collection<T1> collection1; 
Collection<T2> collection2; 

Si potrebbe scrivere un wrapper iterabile che scorre su entrambe e restituisce una sorta di risultato unito.

for(TwoThings<T1, T2> thing : new TwoCollectionWrapper(collection1, collection2) { 
    // one of them could be null if collections have different length 
    T1 t1 = thing.getFirst(); 
    T2 t2 = thing.getSecond(); 
} 

Questo è il più vicino a ciò a cui riesco a pensare, ma a me non sembra molto utile. Se entrambe le collezioni sono pensate per essere ripetute insieme, sarebbe più semplice creare uno Collection<TwoThings> in primo luogo.

Oltre a iterare in parallelo, è possibile anche eseguire un'iterazione sequenziale. Esistono implementazioni per questo, ad es. Guava's Iterables.concat()

1

La semplice risposta "No" è già stata data. Ma potresti implementare prendendo come argomento due iteratori e restituendo coppie di elementi provenienti dai due iteratori. Coppia essere una classe con due campi. Dovresti implementarlo tu stesso, o probabilmente esiste in alcuni commons apache o lib simili.

Questo nuovo Iterator può quindi essere utilizzato nel ciclo foreach.

2

Il seguente dovrebbe avere lo stesso effetto (performance) che si sta tentando di raggiungere:

List<Item> aItems = new List<Item>(); 
List<Item> bItems = new List<Item>(); 
... 
Iterator aIterator = aItems.iterator(); 
Iterator bIterator = bItems.iterator(); 
while (aIterator.hasNext() && bIterator.hasNext()) { 
    Item aItem = aIterator.next(); 
    Item bItem = bIterator.next(); 
}