質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

1127閲覧

java 異なるlistの要素を加算して新たなリストを作りたい

minnmin37

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2020/05/22 08:10

以下の様な異なるリスト同士の要素を足し算して新たなリストを作りたいです。

List1 1,3,5,7,9
List2 2,4,6,8,10

新たなList 3,7,11,15,19

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/24 00:03

forEachRemaining (・∀・)イイネ!!
guest

0

zip/mapのチェーン

他の言語だとこの質問は成立しないでしょう。zipmapのチェーンで簡単にできるから。Javaだとziptupleを作らなければならず退屈。省略してzipmapを一度にやることにします。

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

ziptupleでやるとこうなる。

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
xebme

総合スコア1090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2020/05/23 01:57

そうなんです。 専らC#の私はこんなのzip一発では?と思って調べたら、まだ入っていないそうで^^; 丸投げには違いありませんが軽く調べたところ、ズバリなページを見つけられなかったため、閲覧者のためもあり回答した次第です^^
LouiS0616

2020/05/23 02:22

Pythonだと内包表記を使うとすっきり書けそうです。 print([e1+e2 for e1, e2 in zip(l1, l2)]) HaskellにはzipWithという関数があり、この役割はまさにzippingMapです。 print $ zipWith (+) l1 l2
退会済みユーザー

退会済みユーザー

2020/05/23 03:47

よくある unmodifiedList を突っ込んだらエラーになるよなこれ
xebme

2020/05/23 23:20 編集

> よくある unmodifiedList を突っ込んだらエラーになるよなこれ なります。だから引数3つのメソッド内でArrayListをnewしています。防衛策。 関数型言語のようにunmodifiedListのhead/tailがしたいのです。イミュータブルなまま処理がしたいのですが、remove()しています。ここは課題ですね。
xebme

2020/05/23 05:34

> とりあえず要素数2万にしたら落ちたなw 末尾再帰しない言語ですから仕方ありません。Javaの代わりに謝ります。
xebme

2020/05/24 03:55

どの言語もzipは短い方に揃えるのだけれど、なぜかを説明しろと言われると、タプルに格納する型が同じとは限らないから、そもそも欠損値はNoneとして扱うしかないからなど。これは課題。
guest

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; }

大喜利2

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

TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問