22

私はブラウジングしていて、次のような文字でグループ化することについての質問を見つけましたString:

入力:

"aaabbbccccdd"

次の出力が生成されます。

"aaa"
"bbb"
"cccc"
"ddd"

そして、私はこの提案を見つけました:

val str = "aaabbbccccdd"[
val list = str.groupBy(identity).toList.sortBy(_._1).map(_._2)

そして、このidentity男は私に興味をそそられました。PreDef次のように定義されていることがわかりました。

identity[A](x: A): A

基本的に、与えられたものは何でも返しますよね?しかし、それは への呼び出しにどのように適用されますgroupByか?

これが基本的な質問である場合は申し訳ありませんが、関数型プログラミングがまだ私の頭を少し混乱させているということです。この質問をより明確にするために私が提供できる情報があれば教えてください

4

6 に答える 6

8

まず、文字列を反復処理するとどうなるか見てみましょう。

scala> "asdf".toList
res1: List[Char] = List(a, s, d, f)

次に、オブジェクトの特定の属性に基づいて要素をグループ化したい場合があるとします。

たとえば、次のように文字列のリストを長さでグループ化できます...

List("aa", "bbb", "bb", "bbb").groupBy(_.length)

各アイテムをアイテム自体でグループ化したい場合はどうでしょう。次のように ID 関数を渡すことができます。

List("aa", "bbb", "bb", "bbb").groupBy(identity)

あなたはこのようなばかげたことをすることができますが、それはばかげているでしょう:

List("aa", "bbb", "bb", "bbb").groupBy(_.toString)
于 2013-10-03T18:09:36.323 に答える
3

を見てみましょう

str.groupBy(identity)

返す

scala.collection.immutable.Map[Char,String] = Map(b -> bbb, d -> dd, a -> aaa, c -> cccc)

したがって、要素をグループ化するキーは文字です。

于 2013-10-03T18:11:10.640 に答える
1

groupByStringなどのメソッドを使用しようとするたびに。StringOps暗黙的に に変換され、 に変換されない ことに注意することが重要List[Char]です。

ストリングオプス

の署名はgroupBy-

def groupBy[K](f: (Char) ⇒ K): Map[K, String]

したがって、結果は次の形式になります-

Map[Char,String]

リスト[文字]

の署名はgroupBy-

def groupBy[K](f: (Char) ⇒ K): Map[K, List[Char]]

暗黙的にList[Char]結果に変換された場合、次の形式になります-

Map[Char,List[Char]]

これで、scala がどのようにgroupByon Char(署名を参照) を見つけたのにMap[Char, String].

于 2013-10-03T18:41:23.530 に答える