Pythonでいうところのzip関数使って2つのリストをloop処理することは、
Javaでどう書けばよいですか?
そもそもできなさそう。。。
従来forではなく拡張forで書きたいです。
Python
1for i, j in zip(list1, list2): 2 pass
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
余計なコードが必要になると思います。
java
1import java.util.*; 2 3class Value<E1,E2> { 4 final E1 i; 5 final E2 j; 6 Value(E1 i, E2 j) { 7 this.i = i; 8 this.j = j; 9 } 10 static <E1,E2> Collection<Value<E1,E2>> zip(List<E1> iList, List<E2> jList) { 11 int size = Math.min(iList.size(), jList.size()); 12 List<Value<E1,E2>> list = new ArrayList<>(size); 13 for(int i=0; i<size; i++) list.add(new Value<E1,E2>(iList.get(i), jList.get(i))); 14 return list; 15 } 16} 17 18public class Main { 19 public static void main(String[] args) throws Exception { 20 List<Integer> list1 = Arrays.asList(1,2,3,4); 21 List<String> list2 = Arrays.asList("A","B","C"); 22 23 for(Value<Integer,String> v : Value.zip(list1, list2)) { 24 System.out.println("i="+v.i+", j="+v.j); 25 } 26 } 27}
plain
1i=1, j=A 2i=2, j=B 3i=3, j=C
nukasa さんが仰られるように、普通に for で書けば以下で済むことです。
java
1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 List<Integer> list1 = Arrays.asList(1,2,3,4); 6 List<String> list2 = Arrays.asList("A","B","C"); 7 8 int size = Math.min(list1.size(), list2.size()); 9 for(int i=0; i<size; i++) { 10 System.out.println("i="+list1.get(i)+", j="+list2.get(i)); 11 } 12 } 13}
投稿2022/03/25 09:09
編集2022/03/25 09:20総合スコア13349
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/25 10:35

0
Javaではできないです。
list1とlist2の要素数が同じだとわかっていれば、list1でループを回し、ループの中でlist2から要素を一つずつ取り出すことで、同等のことはできますが。
要素数が違う場合は、無理くりやるなら、こんなコードになるでしょう。
Java
1try { 2 var it2 = list2.iterator(); 3 for (Foo i : list1) { 4 j = it2.next(); 5 ... 6 } 7} catch (NoSuchElementException e) {}
Javaでの一般的なやり方としては、「従来for」でlist1とlist2の要素数の少ない方分だけループし、list1、list2双方からgetメソッドで値を取得するようにしますね。
投稿2022/03/25 05:30
編集2022/03/25 05:56総合スコア406
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
while
やってみると、Javaならiteratorを2つ使うwhileが自然です。
Java
1 var a = List.of(1,2,3,4); 2 var b = List.of("x","y","z","a","b"); 3 var l1 = a.iterator(); 4 var l2 = b.iterator(); 5 while (l1.hasNext() && l2.hasNext()) 6 System.out.println(l1.next() + " " + l2.next());
拡張for
pythonicに拡張forでやれ。つぎのようにIterableを使います。タプルも定義。
Java
1 var a = List.of(1,2,3,4); 2 var b = List.of("x","y","z","a","b"); 3 for (var e : new Zip<>(a,b)) 4 System.out.println(e.x() + " " + e.y());
Iterable
拡張forは内部でIterableを実装するクラスを使います。しかし、上のwhileをIterableでラップして大げさにしているだけです。
Java
1import java.util.Iterator; 2import java.util.List; 3 4record Tuple<T,U>(T x, U y){} 5 6class Zip<T,U> implements Iterable<Tuple<T,U>> { 7 8 final Iterator<T> l1; 9 final Iterator<U> l2; 10 11 public Zip(List<T> list1,List<U> list2) { 12 l1 = list1.iterator(); 13 l2 = list2.iterator(); 14 } 15 16 @Override 17 public Iterator<Tuple<T,U>> iterator() { 18 return new Iterator<>() { 19 @Override 20 public boolean hasNext() { 21 return l1.hasNext() && l2.hasNext(); 22 } 23 @Override 24 public Tuple<T,U> next() { 25 if (!hasNext()) { 26 throw new RuntimeException(); 27 } 28 return new Tuple<>(l1.next(),l2.next()); 29 } 30 }; 31 } 32} 33
投稿2022/03/26 10:27
編集2022/03/26 10:38総合スコア1109
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。