2013-04-13 24 views
41

Ho due liste Array, dichiarato come:Come eseguire l'iterazione tra due liste di array contemporaneamente?

ArrayList<JRadioButton> category = new ArrayList<JRadioButton>(); 
ArrayList<Integer> cat_ids = new ArrayList<Integer>(); 

Entrambi i questi campi contengono esattamente, la stessa, non di valori, che sono infatti corrispondenti in natura.

So che posso iterare su una delle anse come questo:

for(JRadioButton button: category) 
{ 
    if(button.isSelected()) 
    { 
      buttonName = button.getName(); 
      System.out.println(buttonName);  
    } 
} 

Ma, vorrei iterare entrambe le liste contemporaneamente. So che hanno esattamente la stessa dimensione. Come lo faccio?

+0

fondamentalmente questo dovrebbe essere sufficiente perché si vuole iterare ids? – RE60K

+0

Dovresti provare ad usare una mappa qui invece di due liste. – nikhil

risposta

77

È possibile utilizzare Collection#iterator:

Iterator<JRadioButton> it1 = category.iterator(); 
Iterator<Integer> it2 = cats_ids.iterator(); 

while (it1.hasNext() && it2.hasNext()) { 
    ... 
} 
10

Prova questa

ArrayList<JRadioButton> category = new ArrayList<JRadioButton>(); 
ArrayList<Integer> cat_ids = new ArrayList<Integer>(); 
for (int i = 0; i < category.size(); i++) { 
    JRadioButton cat = category.get(i); 
    Integer id= cat_ids.get(i); 
    .. 
} 
+3

Vorrei aggiungere i giorashc

+0

Poco fuori dall'ambito, ma usare sempre l'interfaccia quando si lavora con le collezioni. Elenco category = new ArrayList (); –

0

Anche se vi aspettate entrambi i formati ad essere lo stesso, solo per essere sul lato più sicuro ottenere le dimensioni per ciascuno di essi e fare certo che sono uguali.

Lascia che il valore della dimensione sia count. Quindi utilizzare generico per ciclo, iterare fino a contare e accedere ai valori come indici di array. Se "i" è l'indice, quindi acess come sotto nel ciclo for.

category[i] and cat_ids[i] 

category[i].isSelected() e così via

0
ArrayList<JRadioButton> category = new ArrayList<JRadioButton>(); 
ArrayList<Integer> cat_ids = new ArrayList<Integer>(); 
Iterator<JRadioButton> itrJRB = category.iterator(); 
Iterator<Integer> itrInteger = cat_ids.iterator(); 
while(itrJRB.hasNext() && itrInteger.hasNext()) { 
    // put your logic here 
} 
9

Se si fa questo, spesso si può considerare l'utilizzo di una funzione di supporto a zip due liste in una lista coppia:

public static <A, B> List<Pair<A, B>> zip(List<A> listA, List<B> listB) { 
    if (listA.size() != listB.size()) { 
     throw new IllegalArgumentException("Lists must have same size"); 
    } 

    List<Pair<A, B>> pairList = new LinkedList<>(); 

    for (int index = 0; index < listA.size(); index++) { 
     pairList.add(Pair.of(listA.get(index), listB.get(index))); 
    } 
    return pairList; 
} 

Sarà inoltre necessario un'implementazione di coppia. Il pacchetto lang di Apache Commons ha un pacchetto adeguato.

E con questi si può ora elegantemente iterare sulla pairlist:

ArrayList<JRadioButton> category = new ArrayList<JRadioButton>(); 
ArrayList<Integer> cat_ids = new ArrayList<Integer>(); 

for (Pair<JRadioButton, Integer> item : zip(category , cat_ids)) { 
    // do something with JRadioButton 
    item.getLeft()... 
    // do something with Integer 
    item.getRight()... 
} 
+1

funzionerà se la dimensione degli elenchi è diversa? – fiddle

+2

No. Ecco perché la nuova riga IllegalArgumentException ... è lì. Non è ovvio cosa fare se le due liste hanno dimensioni diverse: ritaglia quella più lunga o usa i segnaposto per riempire il più corto. Poiché il segnaposto può dipendere dal tipo di elenchi, è meglio non essere gestito in un'implementazione generica. –

+0

Ottimo e perfetto! (scusate per il commento thanx) –

6

java8 stile:

private static <T1, T2> void iterateSimultaneously(Iterable<T1> c1, Iterable<T2> c2, BiConsumer<T1, T2> consumer) { 
    Iterator<T1> i1 = c1.iterator(); 
    Iterator<T2> i2 = c2.iterator(); 
    while (i1.hasNext() && i2.hasNext()) { 
     consumer.accept(i1.next(), i2.next()); 
    } 
} 
// 
iterateSimultaneously(category, cay_id, (JRadioButton b, Integer i) -> { 
    // do stuff... 
}); 
Problemi correlati