【问题标题】:Scala version of Rubys' each_slice?Rubys 的 each_slice 的 Scala 版本?
【发布时间】:2010-03-16 16:16:35
【问题描述】:

Scala 是否有来自 Array 类的 Rubys 的 each_slice 版本?

【问题讨论】:

    标签: ruby collections scala scala-2.8


    【解决方案1】:

    Scala 2.8 有grouped 可以将数据分块为大小为n 的块(可用于实现each_slice 功能):

    scala> val a = Array(1,2,3,4,5,6)
    a: Array[Int] = Array(1, 2, 3, 4, 5, 6)
    
    scala> a.grouped(2).foreach(i => println(i.reduceLeft(_ + _)) )
    3
    7
    11
    

    据我记得,2.7.x 中没有任何东西可以开箱即用,但是从 take(n)drop(n)RandomAccessSeq 构建起来非常容易:

    def foreach_slice[A](s: RandomAccessSeq[A], n: Int)(f:RandomAccessSeq[A]=>Unit) {
      if (s.length <= n) f(s)
      else {
        f(s.take(n))
        foreach_slice(s.drop(n),n)(f)
      }
    }
    
    scala> val a = Array(1,2,3,4,5,6)
    a: Array[Int] = Array(1, 2, 3, 4, 5, 6)
    
    scala> foreach_slice(a,2)(i => println(i.reduceLeft(_ + _)) )                 
    3
    7
    11
    

    【讨论】:

    • 最好创建一个Array 包装类,它使用原始的Array 作为后端,而目前只是其中的一部分。然后可以将隐式eachSlice 方法添加到Array,返回List[ArraySlice]。您不想在答案中尝试一下吗? :-) 我不能给你更多的选票,但我很佩服你。 :-) :-)
    • @Daniel:哈哈哈——是的,那会更好(更快),但如果它不在某个图书馆中(为什么会因为我们在 2.8 中已经有了 grouped?),我我想我会把它作为练习留给读者。
    • 它会更好地用于就地算法。您可以随时提交它以增强 Scala。不过,最好先注册贡献者表格。我希望看到这样的选项可用。
    • 也许我会在@specialized 被推入图书馆之后比现在多一点。否则,装箱/拆箱开销无论如何都会淹没原始类型的所有内容。
    【解决方案2】:

    使用 Scala 2.8 测试:

    scala> (1 to 10).grouped(3).foreach(println(_))
    IndexedSeq(1, 2, 3)
    IndexedSeq(4, 5, 6)
    IndexedSeq(7, 8, 9)
    IndexedSeq(10)
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 2011-11-05
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多