web-dev-qa-db-ja.com

Java 2つの配列を持つforeachループ

簡単な質問があります。Javaで次のようなことを実行できますか?

ArrayList<String> arr1 = new ArrayList<String>();
ArrayList<String> arr2 = new ArrayList<String>();

// Processing arrays, filling them with data

for(String str : arr1, arr2) {
    //Do stuff
}

最初の配列、次に次の配列を反復することが目的の場合。

私が理解できる最善の方法は、forループが同じ内部コードを持っている場合に、冗長なコーディングを可能にする個別のforループを使用することです。

別の解決策は、ArrayListの配列を作成することでした。これにより、私の意図を簡単に実現できます。

ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>();

// Initialising arr and populating with data
for(ArrayList<String> tempArr : arr) {
    for(String str : tempArr) {
        //Do stuff
    }
}

しかし、これはコードを読みにくくします。個別の配列の名前を失わないようにする後者のクリーンな方法はありますか?

事前に感謝、デクラン

10
Declan McLeman

不可能、少なくともJava 9。

i1= arr1.iterator();
i2= arr2.iterator();
while(arr1.hasNext() && arr2.hasNext()) 
{

   ToDo1(arr1.next());
   ToDo2(arr2.next());
} 
8
Suresh Atta

回避策はStreamsを使用することです

 Stream.concat(arr1.stream(),arr2.stream()).forEachOrdered(str -> {
   // for loop body
 });
3
Sleiman Jneidi

Java 8でStream.ofおよびflatMapを使用して複数のコレクションをチェーンし、Stream.ofに渡された順序で順次反復することができます

Stream.of(s1, s2 ...).flatMap(s -> s)

例:

ArrayList<String> arr1 = new ArrayList<>();
ArrayList<String> arr2 = new ArrayList<>();

arr1.add("Hello");
arr2.add("World");

Stream.of(arr1.stream(), arr2.stream()).flatMap(s -> s).forEach(s1 -> {
    System.out.println(s1);
});

上記のコードが印刷されます

Hello
world
1
Saleem

不可能、以下のコードを試してください

List<String> arr1=new ArrayList<String>();
List<String> arr2==new ArrayList<String>();
List<ArrayList<String>> arrList=new ArrayList<ArrayList<String>>();
arrList.add(arr1);
arrList.add(arr2);
for(ArrayList<String> strlist : arrList) {
  for(String s:strlist){
      // process array
   }
}