2013-04-13 22 views
41

ich zwei Array-Listen, erklärt wie:Wie simultan durch zwei ArrayLists?

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

genau Beide der diese Felder enthalten, die gleiche Anzahl der Werte, die in der Natur entsprechenden infact sind.

Ich weiß, dass ich über eine der Schleifen wie diese laufen kann:

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

Aber, ich möchte über die LISTEN beide gleichzeitig iterieren. Ich weiß, dass sie genau die gleiche Größe haben. Wie mache ich das?

+0

im Grunde sollte dies ausreichen, um warum wollen Sie iterieren ids? – RE60K

+0

Sie sollten versuchen, eine Karte anstelle von zwei Listen zu verwenden. – nikhil

Antwort

77

können Sie verwenden Collection#iterator:

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

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

Versuchen Sie, diese

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

Ich würde i giorashc

+0

Etwas außerhalb des Geltungsbereichs, aber immer die Schnittstelle verwenden, wenn Sie mit Sammlungen arbeiten. Liste category = new ArrayList (); –

0

Obwohl Sie beide Größen erwarten gleich sein, nur auf sicheren Seite zu sein, sowohl die Größen von ihnen und machen sicher, dass sie gleich sind.

Lassen Sie diesen Größenwert count sein. Verwenden Sie dann generic for loop, iterate bis count und greifen Sie auf die Werte als Array-Indizes zu. Wenn 'i' der Index ist, dann gehe wie unten in der for-Schleife vor.

category[i] and cat_ids[i] 

category[i].isSelected() und so weiter

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

Wenn Sie tun dies oft können Sie mit einer Hilfsfunktion betrachten zwei Listen in eine Paarliste zip:

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

Sie benötigen außerdem eine Paar-Implementierung. Apache commons lang-Paket hat eine richtige.

Und mit diesen Ihnen jetzt elegant auf dem pairlist laufen kann:

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

funktioniert das, wenn die Größe der Listen unterschiedlich ist? – fiddle

+2

Nein. Deshalb ist die neue Zeile IllegalArgumentException ... da. Es ist nicht offensichtlich, was zu tun ist, wenn die zwei Listen unterschiedliche Größen haben: Schneiden Sie die längere, oder verwenden Sie Platzhalter, um die kürzere zu füllen. Da der Platzhalter vom Typ der Listen abhängig sein kann, sollte er besser nicht in einer generischen Implementierung behandelt werden. –

+0

Großartig und perfekt! (Entschuldigung für Danke Kommentar) –

6

java8 Stil:

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... 
}); 
Verwandte Themen