LoginSignup
0
0

More than 5 years have passed since last update.

整数配列の連続区間をグループ化するやつの改良

Last updated at Posted at 2016-01-08

昼間に書いたやつは整数にしか対応してなかったので文字でもできるようにしてみた。

scalazを使うと簡単にできる。

import scalaz._
import Scalaz._

object Main extends App {

  def group_mini[A](seq: Seq[A], s: A, e: A)(implicit enum: Enum[A]): Seq[(A, A)] = seq match {
    case Nil => Seq((s, e))
    case h+:t =>
      if(h === e.succ)
        group_mini(t, s, h)
      else
        (s, e) +: group_mini(t, h, h)
  }

  def group[A](seq: Seq[A])(implicit enum: Enum[A]) = seq match {
    case Nil => Nil
    case h+:t => group_mini(t, h, h)
  }

  val sample1 = Seq(1, 2, 3, 4, 5, 8, 9, 10, 13, 14, 20, 22)
  val sample2 = "ABCabc01234def56789DEF".sorted

  println(group(sample1))
  println(group(sample2))
}

実行結果

List((1,5), (8,10), (13,14), (20,20), (22,22))
List((0,9), (A,F), (a,f))

scalaz使わなくてもできるのかな?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0