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

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

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

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Java

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

Q&A

解決済

3回答

3215閲覧

Scalaですでにあるリストの中身をマージして新たなリストを作る方法があるでしょうか?

nasum

総合スコア64

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Java

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

0グッド

0クリップ

投稿2015/01/22 10:48

Scala初心者です。
ScalaですでにあるListを処理し、新たなリストを作る方法はあるでしょうか?
やりたいこととしては、SampleClassのListの中身を走査して同じIDだったらマージし、最終的にMargeClassのListに変換するということを目指しています。

lang

1public class SampleClass { 2 public SampleClass(int id, String str) { 3 this.id = id; 4 this.str = str; 5 } 6 7 public int id; 8 public String str; 9} 10 11//マージしたものを入れるクラス 12public class MargeClass { 13 public SampleClass(int id, String str) { 14 this.id = id; 15 this.str = new ArrayList<>; 16 str.add(str); 17 } 18 19 public int id; 20 public List<String) str; 21}

lang

1val list = new ArrayList[SampleClass] 2 3//listに値を入れる処理 4 5//同じIDの要素はマージする処理 6

reduceとかそういうものを使えばいいのかと思いましたが、自分の理解がとぼしくうまく実装できません。ご教授いただけると幸いです。

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

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

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

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

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

guest

回答3

0

Scalaの流儀では、更新可能なコンテナーはあまり使いません。

それと、ScalaのListは関数型プログラミングでお馴染みの連結リストです。
ArrayListの代わりなら、Arrayを使った方が良いかもしれません。

また、SampleClassMargeClassのような情報なら、
新しくクラスを作らなくても、タプルを使って、
Array[(int, String)]からArray[(int, Array[String])]
変換すれば同じ情報が得られると思います。

途中の状態が分かるように、中間の状態を変数に入れていますが、
メソッドチェインにしてもOKです。

lang

1 val a: Array[(Int, String)] 2 = Array((1, "aa"), (2, "bb"), (3, "cc"), (2, "dd"), (4, "ee"), (4, "ff")) 3 val aa: Map[Int, Array[(Int, String)]] = a groupBy ( _._1 ) 4// val aaa = aa.foreach { x => // 訂正: ここの変数は不要でした 5 aa.foreach { x => 6 val (id, tuples) = x 7 val strings = tuples map ( _._2 ) mkString(", ") 8 println(s"id = $id, strings = $strings") 9 }

実行結果

id = 2, strings = bb, dd id = 4, strings = ee, ff id = 1, strings = aa id = 3, strings = cc

もっと綺麗に書けるかもしれませんので、研究してみてください。

投稿2015/01/22 12:45

argius

総合スコア9388

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

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

nasum

2015/01/23 00:25

回答ありがとうございます。 classを使わないでも実現できるのですね。タプルという機能は恥ずかしながら知らなかったので後で調べてみます。 ありがとうございました。
guest

0

ベストアンサー

自分も初心者なので適切な解かどうかはあやしいですが例えばこういうのではいかがでしょうか。

lang

1case class SampleClass(val id: Int, val str: String) 2case class MergedClass(val id: Int, val str: List[String]) 3 4val list = List(SampleClass(1, "a"), SampleClass(2, "b"), SampleClass(1, "c")) 5val mergedList = list.groupBy(_.id).map(ent => MergedClass(ent._1, ent._2.map(_.str))) 6println(mergedList)

結果出力: List(MergedClass(2,List(b)), MergedClass(1,List(a, c)))

ただし、質問ではArrayListをお使いですがScalaなのでListを使っています。ArrayListにする必要があるならscala.collection.JavaConvertersにあるasJava/asScalaなどでコレクションの変換をしてやるか(暗黙変換をいとわなければ)scala.collection.JavaConversionsの暗黙変換を使って似たような感じにできると思います。

追記: この方法だとgroupByの結果がMapになるため要素の順番は保存されません。保存する必要があるならまた違った方法になると思いますが、自分だとforeachでしか書けそうもないので多分回答にならないです。

投稿2015/01/22 12:42

KSwordOfHaste

総合スコア18394

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

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

nasum

2015/01/23 00:19

回答ありがとうございます。 groupByとmapで実現するのですね。要素の順番等には気をつけたいと思います。 ありがとございました。
guest

0

どうでもいいけど、マージはmergeだけどね...

投稿2015/03/17 10:59

chokojori

総合スコア971

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問