2013-04-13 16 views
41

Mam dwie listy tablicy, zadeklarowane jako:Jak wykonać iterację między dwoma ArrayLists jednocześnie?

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

Oba te pola zawierają dokładnie taki sam, bez wartości, które są rzeczywiście odpowiada w naturze.

wiem, że mogę iteracyjne nad jednym z pętli, jak to:

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

Ale chciałbym iteracyjne nad obu listach jednocześnie. Wiem, że mają dokładnie taki sam rozmiar. Jak mogę to zrobić?

+0

zasadzie powinno to wystarczyć dlaczego chcesz iteracyjne nad identyfikatory? – RE60K

+0

Powinieneś spróbować użyć mapy tutaj zamiast dwóch list. – nikhil

Odpowiedz

77

Można użyć Collection#iterator:

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

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

Spróbuj

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

Dodałbym i giorashc

+0

Trochę poza zakresem, ale zawsze używaj interfejsu, gdy pracujesz z kolekcjami. Lista category = new ArrayList (); –

0

Chociaż spodziewasz oba rozmiary być takie same, po prostu się na bezpieczniejsze strony dostać rozmiary dla obu z nich i dokonać na pewno są równi.

Niech ta wartość będzie równa count. Następnie użyj ogólnej pętli, wykonaj iterację do zliczenia i uzyskaj wartości jako indeksy tablicowe. Jeśli "i" jest indeksem, to dostaniemy się jak poniżej w pętli for.

category[i] and cat_ids[i] 

category[i].isSelected() i tak dalej

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

Jeśli zrobisz to często można rozważyć użycie funkcji pomocnika zip dwie listy do jednej listy pary:

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

Potrzebny będzie również Implementacja Pair. Pakiet Apache commons lang ma prawidłowy.

A z nich można teraz elegancko iteracyjne na 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

Czy to działa, jeśli rozmiar list jest inny? – fiddle

+2

Nie. Dlatego właśnie pojawiła się nowa linia IllegalArgumentException .... Nie jest oczywiste, co zrobić, jeśli dwie listy mają różne rozmiary: przycinaj dłuższą lub użyj symboli zastępczych, aby wypełnić krótszą. Ponieważ symbol zastępczy może zależeć od typu list, lepiej nie być traktowany w ogólnej implementacji. –

+0

Świetne i doskonałe! (przepraszam za komentarz na temat thanx) –

6

java8 styl:

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... 
}); 
Powiązane problemy