2013-04-13 3 views
41

У меня есть два массива списков, заявленные как:Как проходить через два массива одновременно?

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

Оба этих поли содержат точно, то же Нет значения, которые Infact соответствующего в природе.

Я знаю, что могу перебрать одной из петель, как это:

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

Но я хотел бы, чтобы перебрать и СПИСКИ одновременно. Я знаю, что у них одинаковый размер. Как мне это сделать?

+0

в основном это должно быть достаточно, почему вы хотите перебрать идентификаторы? – RE60K

+0

Вы должны попытаться использовать карту здесь вместо двух списков. – nikhil

ответ

77

Вы можете использовать Collection#iterator:

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

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

Попробуйте

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

Я бы добавил i giorashc

+0

Немного вне сферы действия, но всегда используйте интерфейс, когда вы работаете с коллекциями. Список category = new ArrayList (); –

0

Хотя вы ждете обоих размеров, чтобы быть таким же, просто чтобы быть на безопасной стороне получить размеры для обоих из них и сделать уверен, что они равны.

Дайте этому размеру значение count. Затем используйте generic для цикла, итерации до count и acess значения как индексы массива. Если «i» - это индекс, то как показано ниже в цикле for.

category[i] and cat_ids[i] 

category[i].isSelected() и так далее

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

Если вы делаете это часто вы можете рассмотреть возможность использования вспомогательной функции застегнуть два списка в один список пар:

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

Вам также потребуется реализация пары. У пакета Apache commons lang есть правильный.

И с этим вы можете теперь элегантно итерацию на 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

будет работать, если размер списков отличается? – fiddle

+2

Нет. Вот почему появляется новая строка IllegalArgumentException .... Не очевидно, что делать, если два списка имеют разные размеры: обрезать дольше или использовать заполнители для заполнения короче. Поскольку заполнитель может зависеть от типа списков, лучше не обрабатываться в общей реализации. –

+0

Отлично, и отлично! (извините за комментарий thanx) –

6

java8 стиля:

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... 
}); 
Смежные вопросы