このページの記事一覧

2012年4月5日木曜日

2つのリストを同時に処理する

うまいタイトルを思いつかなかったんですが、要するにJavaで言うところの

   1: List<Integer> xs = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
   2: List<Integer> ys = Arrays.asList(11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
   3: List<Integer> zs = new ArrayList<>();
   4:  
   5: for (int i = 0; i < xs.size(); i++) {
   6:     zs.add(xs.get(i) + ys.get(i));
   7: }
   8:  
   9: // 出力処理

と同じことをScalaでやるにはどうするのかなーということです。
とりあえず調べたり、自分で考えたりした結果、3(+1)パターンは分かりました。



   1: // 前提
   2: val xs = 1 to 10
   3: val ys = 11 to 20
   4:  
   5: // リストを要素としたタプルを作って、zippedしてmapする
   6: val z1 = (xs, ys).zipped.map((x, y) => x + y)
   7:  
   8: // for式を利用する
   9: val z2 = for ((x, y) <- xs.zip(ys)) yield x + y
  10:  
  11: // タプルを要素としたリストを作ってmapする
  12: val z3 = xs.zip(ys).map(t => t._1 + t._2)
  13:  
  14: // 上と一緒だけど、パターンマッチを使ってみた
  15: val z4 = xs.zip(ys).map{case (x, y) => x + y}

一応自分の備忘録として。
他にもこんな書き方あるよ!っていうのがあればぜひ教えてください(xs.zip(ys) は xs zip ys って書けるよ!っていうのは除いて)。


(Scalaのコード書いてからJavaのコード書いたんだけど、Java書くの面倒臭いなw)