2014-01-12 5 views
-2

Я хочу написать Еогеасп так:Как написать цикл foreach?

for (Object object1 : list1 , Object object2 : list2) 

Возможно ли это?

+6

Ваш компилятор сообщит вам, что является законным или нет. Что именно ты пытаешься сделать? Возможно, вложенные петли могут помочь. Если ваш код вызывает сообщения об ошибках, было бы разумно опубликовать их с вашим вопросом и не заставить нас угадать. –

+1

вы можете пойти в java doc, чтобы узнать больше о foreach –

+0

Я хочу читать из обоих списков подряд за строкой –

ответ

0

В одном заявлении foreach вам не разрешается выполнять итерацию по двум коллекциям одновременно. Если вы хотите использовать только один файл foreach, сначала необходимо объединить коллекции.

Вы можете сделать это следующим образом:

import java.util.*; 

public class HelloWorld{ 

    public static void main(String []args){ 
     String s1 = "string 1"; 
     String s2 = "string 2"; 
     String s3 = "string 3"; 
     String s4 = "string 4"; 

     List<String> list1 = new ArrayList<String>(); 

     List<String> list2 = new ArrayList<String>(); 

     list1.add(s1); 
     list1.add(s2); 

     list2.add(s3); 
     list2.add(s4); 

     List<String> merged = new ArrayList<String>(); 
     merged.addAll(list1); 
     merged.addAll(list2); 

     for(String s : merged) 
     { 
      System.out.println(s); 
     } 
    } 
} 
5

Написать как вложенный цикл для перебора всех комбинаций элементов

for (Object object1 : list1){ 
    for (Object object2 : list2){ 
     ... 
    } 
} 

или в одной итерации с do...while, это равно кодами выше.

int i = 0, j = 0; 
do { 
    Object object1 = a.get(i) 
    Object object2 = b.get(j) 
    ... 
    if (i == a.size() - 1) j++; 
} while (i < a.size() && j < b.size()); 

Вы также можете объединить оба списка, а затем перебирать все элементы один на один

// Add items to the other list - BEWARE - list1's contens will change 
list1.addAll(list2); 

for (Object object : list1) { 
    ... 
} 

Безопасный путь с гуавы

Iterable<Object> combined = Iterables.unmodifiableIterable(
     Iterables.concat(list1, list2)); 
for (Object object : combined) { 
    System.out.println(object); 
} 
1

Это зависит от того, что вы пытаетесь сделать.

Если вы хотите перебрать 0th в N-й элемент в обеих коллекциях возможности работать с элементами как в теле одна петли, вы можете написать что-то вроде этого:

for(int i = 0;i < list1.size() && i < list2.size();i++) { 
    Object object1 = list1.get(i); 
    Object object2 = list2.get(i); 

    /* your code */ 
    ... 
} 

Обратите внимание, что если одна из коллекций меньше других, дополнительные элементы в большой коллекции не будут обрабатываться.

Если вы хотите перебрать list1, а затем List2, вы можете просто создать новый, содержащий предыдущие два:

List<Object> n = new ArrayList<Object>(list1); 
n.addAll(list2) 
for(Object o : n) { 
    /* your code */ 
    ... 
} 

Или, наконец, если вы хотите перебрать список списков, вы можете

for(List<Object> il : (List<List<Object>>)list1) { 
    for(Object o : il) { 
     /* code for each object in child list */ 
     ... 
    } 

    /* code for each child list in parent */ 
    ... 
} 
+1

он не работает, отлаживайте свой ответ после этого сообщения :) –

+0

Работа? Где? – user35443

+0

Если размер двух списков будет различным –

0

это не возможно писать так, но вы можете использовать этот код вместо

я надеюсь, если это поможет вам

String []one={"hello","thanks"}; 
    int[]two={1,2,3}; 
    String item; 
    int flag; 
    for(int i=0;i<one.length+two.length;i++){ 
     if(i<one.length){ 
      item=one[i]; 
      System.out.println(item); 
     } 
     if(i<two.length){ 
      flag=two[i]; 
     System.out.println(flag); 
     } 
    } 
+0

Это не имеет смысла, поскольку он мог бы одинаково писать две петли с двумя разными диапазонами «i» (где один был бы (возможно равным) подмножеством другого), без какой-либо разницы. – user35443

+0

это работает, и это не дорого, но что вы предлагаете, стоит дорого –

+0

Дорогой? Вы что-то покупаете? – user35443

Смежные вопросы