0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

グループ化とソート

groupBy と sortBy です。

「グループ化とソート」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

データを整理する

現実世界のデータは、プロパティでグループ化したり、キーでソートしたりする必要があることがよくあります。Scalaのコレクションには、これを宣言的に行うためのgroupBy、sortBy、sortWithなどが用意されています。

object Main {
  def main(args: Array[String]): Unit = {
    val nums = List(5, 3, 8, 1, 9, 2)
    println(nums.sorted)
  }
}

sorted:自然順序

sortedは、要素を自然順序でソートします(数値なら昇順、文字列ならアルファベット順)。順序付けが必要ですが、一般的な型には用意されています。

object Main {
  def main(args: Array[String]): Unit = {
    println(List(3, 1, 2).sorted)
    println(List("pear", "apple", "fig").sorted)
  }
}

sortBy:キーでソートする

sortByは、各要素から導出した値でソートします。ソートキーを取り出す関数を指定してください。

object Main {
  def main(args: Array[String]): Unit = {
    val words = List("banana", "fig", "apple")
    val byLength = words.sortBy(_.length)
    println(byLength)
  }
}

降順でソートする

降順でソートするには、数値キーを負にするか、sorted(Ordering.Int.reverse)を使用します。導出したキーの場合は、sortByでマイナス記号を使うと簡潔に書けます。

object Main {
  def main(args: Array[String]): Unit = {
    val nums = List(5, 3, 8, 1)
    println(nums.sortBy(-_))
    println(nums.sorted(Ordering.Int.reverse))
  }
}

sortWith:カスタム比較関数

sortWithは、最初の引数を2番目の引数より前に置くべき場合にtrueを返す関数を受け取り、順序を完全に制御できるようにします。

object Main {
  def main(args: Array[String]): Unit = {
    val nums = List(5, 3, 8, 1)
    val descending = nums.sortWith((a, b) => a > b)
    println(descending)
  }
}

複数のキーでソートする

sortByはタプルを返すことで、複数のキーを一度に使ってソートできます。最初の要素を比較し、同順位の場合は2番目の要素で比較します。

object Main {
  def main(args: Array[String]): Unit = {
    val people = List(("Ann", 30), ("Bob", 25), ("Ann", 22))
    val sorted = people.sortBy { case (name, age) => (name, age) }
    println(sorted)
  }
}

groupBy:Mapに分割する

groupByはMapを返します。各キーは関数の結果であり、各値はそのキーを共有する要素のリストです。

object Main {
  def main(args: Array[String]): Unit = {
    val nums = List(1, 2, 3, 4, 5, 6)
    val byParity = nums.groupBy(_ % 2 == 0)
    println(byParity)
  }
}

計算したキーでグループ化する

グループ化のキーには、先頭文字、長さ、カテゴリなど、何でも指定できます。それぞれ異なるキーが1つのバケットになります。

object Main {
  def main(args: Array[String]): Unit = {
    val words = List("apple", "avocado", "banana", "cherry", "cranberry")
    val byFirstLetter = words.groupBy(_.head)
    byFirstLetter.foreach { case (letter, ws) => println(s"$letter -> $ws") }
  }
}

グループを変換する

グループ化した後は、各バケットを集計したいことがよくあります。view.mapValues(またはmap)を使って値を変換します。たとえば、グループごとの要素数を数えられます。

object Main {
  def main(args: Array[String]): Unit = {
    val words = List("cat", "car", "dog", "deer", "cow")
    val counts = words.groupBy(_.head).view.mapValues(_.size).toMap
    println(counts)
  }
}

groupMapReduceを1ステップで行う

groupMapReduceは、要素のグループ化、各要素のマッピング、各グループの値のreduceを、すべて1回の走査で行います。カテゴリごとの合計のような集計を簡潔に構築できます。

object Main {
  def main(args: Array[String]): Unit = {
    val sales = List(("books", 10), ("toys", 5), ("books", 7), ("toys", 3))
    val totals = sales.groupMapReduce(_._1)(_._2)(_ + _)
    println(totals)
  }
}

グループ化とソートを組み合わせる

よくあるパターンは、データをグループ化し、各グループを集計してから、その集計結果をソートすることです。ここでは、先頭文字ごとの単語数を数え、数でソートします。

object Main {
  def main(args: Array[String]): Unit = {
    val words = List("apple", "avocado", "banana", "cherry", "cranberry", "apricot")
    val ranked = words
      .groupBy(_.head)
      .view.mapValues(_.size).toList
      .sortBy(-_._2)
    println(ranked)
  }
}

クイックチェック

List(1,2,3,4).groupBy(_ % 2 == 0)は何を返しますか。

まとめ

グループ化とソートについて学びました。

  • sorted — 自然順序
  • sortBy — 導出したキーでソートします(複数キーにはタプルを使います)
  • sortWith — カスタム比較関数
  • groupBy — バケットのMapに分割します
  • groupMapReduce — 1回の走査でグループ化、マッピング、reduceを行います

よくある質問

「グループ化とソート」レッスンは無料ですか?

はい。「グループ化とソート」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

「グループ化とソート」で何を学びますか?

groupBy と sortBy です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「グループ化とソート」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. List、Vector、Set、Map
  2. 変換
  3. 畳み込みと削減
  4. グループ化とソート
← Scala for Backend Engineering & Functional Programmingに戻る