以下の様な異なるリスト同士の要素を足し算して新たなリストを作りたいです。
List1 1,3,5,7,9
List2 2,4,6,8,10
新たなList 3,7,11,15,19
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
java
1import java.util.*; 2import java.util.function.*; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 List<Integer> l1 = Arrays.asList(1, 3, 5, 7, 9, 11, 13, 15); 7 List<Integer> l2 = Arrays.asList(0, 2, 4, 6, 8); 8 9 List<Integer> result = zip(l1, l2, (a, b) -> a + b); 10 System.out.println(result); 11 } 12 13 public static <T> List<T> zip(List<? extends T> list1, List<? extends T> list2, BinaryOperator<T> operator) { 14 Iterator<? extends T> ite1 = list1.iterator(); 15 Iterator<? extends T> ite2 = list2.iterator(); 16 List<T> result = new ArrayList<T>(Math.max(list1.size(), list2.size())); 17 while(ite1.hasNext() && ite2.hasNext()) { 18 result.add(operator.apply(ite1.next(), ite2.next())); 19 } 20 ite1.forEachRemaining(result::add); 21 ite2.forEachRemaining(result::add); 22 return result; 23 } 24} 25
投稿2020/05/23 23:13
総合スコア20669
0
zip/mapのチェーン
他の言語だとこの質問は成立しないでしょう。zip
とmap
のチェーンで簡単にできるから。Javaだとzip
とtuple
を作らなければならず退屈。省略してzip
とmap
を一度にやることにします。
Java
1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.List; 4import java.util.function.BinaryOperator; 5 6public class ZipAndMap_ { 7 8 private static <T> List<T> zippingMap(List<T> l1, List<T> l2, BinaryOperator<T> operator, List<T> acc) { 9 if (l1.size() == 0 || l2.size() == 0) return acc; 10 acc.add(operator.apply(l1.get(0), l2.get(0))); 11 return zippingMap(l1.subList(1, l1.size()), l2.subList(1, l2.size()), operator, acc); 12 } 13 14 public static void main(String[] args) { 15 16 List<Integer> l1 = Arrays.asList(1, 3, 5, 7, 9); 17 List<Integer> l2 = Arrays.asList(2, 4, 6, 8, 10); 18 19 List<Integer> result = zippingMap(l1, l2, (a, b) -> a + b, new ArrayList<>()); 20 System.out.println(result); 21 22 } 23 24}
Scala
Scalaで書くとこうなる。
Scala
1object ZipAndMap extends App { 2 val l1 = List(1,3,5,7,9) 3 val l2 = List(2,4,6,8,10) 4 val result = l1.zip(l2).map{case (a,b) => a + b} 5}
Python
初心者の私がPythonで書くとこうなる。
Python
1l1 = [1,3,5,7,9] 2l2 = [2,4,6,8,10] 3map(lambda x: x[0] + x[1], zip(l1,l2))
Java
zip
とtuple
でやるとこうなる。
Java
1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.List; 4 5public class ZipAndMap { 6 7 static class Tuple<T,U> { 8 final T _1; final U _2; 9 public Tuple(T x, U y) {this._1 = x; this._2 = y;} 10 } 11 12 static <T,U> List<Tuple<T,U>> zip(List<T> l1, List<U> l2, List<Tuple<T,U>> acc) { 13 if (l1.size()==0 ||l2.size()==0) return acc; 14 acc.add(new Tuple<>(l1.get(0),l2.get(0))); 15 return zip(l1.subList(1,l1.size()),l2.subList(1,l2.size()),acc); 16 } 17 18 public static void main(String[] args) { 19 20 List<Integer> l1 = Arrays.asList(1,3,5,7,9); 21 List<Integer> l2 = Arrays.asList(2,4,6,8,10); 22 23 List<Tuple<Integer,Integer>> acc = zip(l1,l2,new ArrayList<>()); 24 List<Integer> result = acc.stream().collect(ArrayList::new, (a,e) -> a.add(e._1 + e._2), List::addAll); 25 System.out.println(result); 26 27 } 28 29}
指摘への対応
unmodifiableList
に対応できない
やりたいことは関数型言語のListのhead/tail相当の処理なので、List#get(0)/List#subList(1,<リストのサイズ>)を使うことで効率よく同等の処理ができました。
- スタックオーバーフローにはあえて対応していません。
末尾再帰を最適化できる言語があるからです。
投稿2020/05/23 01:29
編集2020/05/24 00:02総合スコア1090
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/23 02:22
退会済みユーザー
2020/05/23 03:47
退会済みユーザー
2020/05/23 04:38
2020/05/23 23:20 編集
2020/05/23 05:34
2020/05/24 03:55
0
とりあえず大喜利 ってことで
public static List<Integer> zip(List<Integer> a, List<Integer> b) { Iterator<Integer> ia = a.iterator(); Iterator<Integer> ib = b.iterator(); List<Integer> result = new ArrayList(); while(ia.hasNext() || ib.hasNext()) { result.add( (ia.hasNext() ? ia.next() : 0) + (ib.hasNext() ? ib.next() : 0) ); } return result; }
public static List<Integer> zip(List<Integer> a, List<Integer> b) { Iterator<Integer> ia = a.iterator(); Iterator<Integer> ib = b.iterator(); return IntStream.range(0, Math.max(a.size(), b.size())) .mapToObj(index -> (Integer) // ( (ia.hasNext() ? ia.next() : 0) + (ib.hasNext() ? ib.next() : 0) )).collect(Collectors.toList()); }
投稿2020/05/23 06:53
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Java
1import java.util.Arrays; 2import java.util.List; 3import java.util.stream.Collectors; 4import java.util.stream.IntStream; 5 6 7public class Main { 8 public static void main(String[] args) { 9 { 10 List<Integer> List1 = Arrays.asList(1, 3, 5, 7, 9, 11, 13, 15); 11 List<Integer> List2 = Arrays.asList(2, 4, 6, 8, 10); 12 13 List<Integer> 新たなList = IntStream 14 .range(0, Math.min(List1.size(), List2.size())) 15 .mapToObj(i -> List1.get(i) + List2.get(i)) 16 .collect(Collectors.toList()); 17 18 System.out.println(新たなList); // [3, 7, 11, 15, 19] 19 } 20 { 21 List<Integer> List1 = Arrays.asList(1, 3, 5, 7, 9, 11, 13, 15); 22 List<Integer> List2 = Arrays.asList(2, 4, 6, 8, 10); 23 24 List<Integer> 新たなList = IntStream 25 .range(0, Math.max(List1.size(), List2.size())) 26 .mapToObj(i -> (i < List1.size() ? List1.get(i) : 0) + (i < List2.size() ? List2.get(i) : 0)) // なんか冴えないね^^; 27 .collect(Collectors.toList()); 28 29 System.out.println(新たなList); // [3, 7, 11, 15, 19, 11, 13, 15] 30 } 31 } 32}
投稿2020/05/22 12:59
総合スコア9862
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/24 00:03