2

Scala ではgrouped、左から右に動作します。

val list = List(1,2,3,4,5)
list.grouped(2).toList
=> List[List[Int]] = List(List(1, 2), List(3, 4), List(5))

しかし、私が望むならどうすればいいですか:

=> List[List[Int]] = List(List(1), List(2, 3), List(4, 5))

?

私はこれがうまくいくことを知っています:

list.reverse.grouped(2).map(_.reverse).toList.reverse

ただし、効率的ではないようです。

4

3 に答える 3

3

次に、自分で実装できます。

def rgrouped[T](xs: List[T], n: Int) = {
   val diff = xs.length % n
   if (diff == 0) xs.grouped(n).toList else {
     val (head, toGroup) = xs.splitAt(diff)
     List(head, toGroup.grouped(n).toList.head)
   }
}

かなり醜いですが、うまくいくはずです。

于 2013-06-12T21:36:53.207 に答える
1

これが私の試みです:

def rightGrouped[T](ls:List[T], s:Int) = {
  val a = ls.length%s match { 
    case 0 => ls.grouped(s) 
    case x => List(ls.take(x)) ++ ls.takeRight(ls.length-x).grouped(s)
  }
  a.toList
}

使用法:

scala> rightGrouped(List(1,2,3,4,5),3)
res6: List[List[Int]] = List(List(1, 2), List(3, 4, 5))

最初はパターンマッチング無しでやってみたのですが、リストが「偶数」の時はダメでした

val ls = List(1,2,3,4,5,6)
val s = 3
val x = ls.length % s
List(ls.take(x)) ++ ls.takeRight(ls.length-x).grouped(s)

プロデュース:

List(List(), List(1, 2, 3), List(4, 5, 6))
于 2013-06-12T22:15:22.383 に答える
0
val l =List(list.head)::(list.tail grouped(2) toList) 

編集:

@gzm0が私の間違いを指摘した後、解決策を修正しましたが、n = 2でのみ機能します

def group2[T](list: List[T]) ={
    (list.size % 2 == 0) match {
      case true => list.grouped(2).toList
      case false => List(list.head) :: (list.tail grouped(2) toList)

    }
  }

println(group2(List())) 
println(group2(List(1,2,3,4,5)))
println(group2(List(1,2,3,4,5,6)))

List()
List(List(1), List(2, 3), List(4, 5))
List(List(1, 2), List(3, 4), List(5, 6))
于 2013-06-12T22:01:00.907 に答える