簡単な質問があります。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
}
}
しかし、これはコードを読みにくくします。個別の配列の名前を失わないようにする後者のクリーンな方法はありますか?
事前に感謝、デクラン
不可能、少なくともJava 9。
i1= arr1.iterator();
i2= arr2.iterator();
while(arr1.hasNext() && arr2.hasNext())
{
ToDo1(arr1.next());
ToDo2(arr2.next());
}
回避策はStreams
を使用することです
Stream.concat(arr1.stream(),arr2.stream()).forEachOrdered(str -> {
// for loop body
});
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
不可能、以下のコードを試してください
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
}
}