をリストにcount
で印刷したいとします。以下に示すようにだから私は3 options
を持っている:スカラ収集機能
def dups(dup:List[Int]) = {
//1)
println(dup.groupBy(identity).collect { case (x,ys) if ys.lengthCompare(1) > 0 => (x,ys.size) }.toSeq)
//2)
println(dup.groupBy(identity).collect { case (x, List(_, _, _*)) => x }.map(x => (x, dup.count(y => x == y))))
//3)
println(dup.distinct.map((a:Int) => (a, dup.count((b:Int) => a == b))).filter((pair: (Int,Int)) => { pair._2 > 1 }))
}
質問:
- >option 2
のためには、リストのサイズを追加するために使用することができるように、リストのパラメータに名前を付けるためにどのような方法があります私が行ったのと同じようにoption 1
ys.sizeを使用していますか?
- >option 1
の場合、toSeqへの最後の呼び出しを避けてリストを返す方法はありますか?
- > 3つの選択のうちのどれがmore efficient by using the least amount of loops
ですか?
入力例:リスト(1,1,1,2,3,4,5,5,6,100,101,101,102) リストを印刷する:リスト((1,3)、(5,2)、(101、 2)次の操作を行うことであろう最善の方法以下@lutzhの回答に基づいて)
:オプション1の場合
val list: List[(Int, Int)] = dup.groupBy(identity).collect({ case (x, ys @ List(_, _, _*)) => (x, ys.size) })(breakOut)
val list2: List[(Int, Int)] = dup.groupBy(identity).collect { case (x, ys) if ys.lengthCompare(1) > 0 => (x, ys.size) }(breakOut)
最後に 'toSeq'を呼び出して' List'を返すのを避けるのはどういう意味ですか?それ以外に何を返すべきですか? –
1)の収集コールは、(1→3)、(4→4)などのリストを呼び出して印刷するとわかるマップを生成します。実際のリストを印刷する場合はtoSeqが必要です。要素を介して再びループすることによってコレクションを作成しています。私は実際にはペア(x、ys.size)を生成しているので、これは自動的にシーケンスに変換されると思いますが、代わりにマップを保持するので、これを避ける方法があるかどうか疑問に思っています。 – Fabio