0

隣接する要素の違いに基づいて、リストを scala で分割するにはどうすればよいですか。たとえば、List(1,3,6,10,12,14) と差分 3 を指定すると、関数は List(List(1,3),List(6),List(10,12,14)) を返します。

これを行うために foldLeft を使用できますか? 関数を作成しようとしていました

def splitDiff(list:List[Int],diff:Int) = 
     def func(list:List[List[Int]],m:Int):List[List[Int]] = //compare with last element
     list.foldLeft(List(List(0))).foldLeft(func)

でも内部機能は難しそう?何か助けはありますか?

4

4 に答える 4

1

foldLeft を使用したもう 1 つのソリューション:

scala> val x = List(1,3,6,10,12,14)
x: List[Int] = List(1, 3, 6, 10, 12, 14)

scala> val y = x.foldLeft((x.head,List[Int](),List[List[Int]]())) 
     ((x,y)=> if((y- x._1) <3) (y,y :: x._2,x._3) else (y,List(y), x._2 :: x._3))
y: (Int, List[Int], List[List[Int]]) = (14,List(14, 12, 10),List(List(6), List(3
, 1)))

scala> val ans = y._2 :: y._3
ans: List[List[Int]] = List(List(14, 12, 10), List(6), List(3, 1))
于 2013-10-26T10:56:23.600 に答える
0

以下は、追加の反転なしで機能します。Math.absOPは、リストの要素が常に昇順であるかどうかを述べていなかったので、同様に使用するのが良いと思いました:

def splitDiff(diff: Int)(xs: List[Int]): List[List[Int]] = xs match {
  case Nil      => Nil
  case h :: t   =>
    val head = h :: ((xs zip t) takeWhile {
      case (a,b) => Math.abs(b-a) < diff
    } map (_._2))
    head :: splitDiff(diff)(xs drop head.length)
}

このアプローチの欠点は、尾が何度も何度も締められることです。ただし、これは、一致をカプセル化し、最初に 1 回だけ圧縮することで簡単に回避できます。

于 2013-10-27T07:08:42.547 に答える
0

これはテストされていないことに注意してください。

  def splitListDiff(li: List[Int], diff: Int): List[Int] =
        {
          li match {
            case hd :: tl => if (hd - tl < diff) hd :: splitListDiff(tl, diff) else return li ++ splitListDiff(tl, diff)
            case _ => return li
          }
        }

しかし、foldleft を活用するソリューションが必要でしたか?

于 2013-10-26T10:50:53.353 に答える