Scala groupBy:希望数组索引满足谓词,而不是数组值

时间:2011-09-15 18:36:37

标签: scala group-by

    val m = Array(10,20,30,30,50,60,70,80) groupBy ( s => s %30 == 0)
    m(true).map { kv => println(kv) }

打印值30,30,60

我希望打印索引,即2,3,5。

我该怎么做?

5 个答案:

答案 0 :(得分:8)

val m = Array(10,20,30,30,50,60,70,80).zipWithIndex.groupBy(s =>
  s._1 % 30 == 0).map(e => e._1 -> (e._2.unzip._2))

仅供参考,如果您只想要true值,那么您可以使用@ missingfaktor的方法,同样可以partition这个:

val m = Array(10, 20, 30, 30, 50, 60, 70, 80).zipWithIndex.partition(s =>
  s._1 % 30 == 0)._1.unzip._2

答案 1 :(得分:6)

Array(10, 20, 30, 30, 50, 60, 70, 80)
  .zipWithIndex
  .collect { case (element, index) if element % 30 == 0 => index }
// Array[Int] = Array(2, 3, 5)

答案 2 :(得分:6)

这是另一种方法:

Array(10,20,30,30,50,60,70,80).zipWithIndex.filter{ _._1 % 30 == 0 }.map{ _._2 }

我发现.map{ _._2 }.unzip._2更容易理解,但也许这只是我。有趣的是上面的回报:

Array[Int] = Array(2, 3, 5)

虽然解压缩变体返回:

scala.collection.mutable.IndexedSeq[Int] = ArrayBuffer(2, 3, 5)

答案 3 :(得分:1)

这是一种更直接的方式,

val m = Array(10,20,30,30,50,60,70,80).zipWithIndex.filter(_._1 % 30 == 0).unzip

将值和索引作为一对获得,(ArrayBuffer(30, 30, 60),ArrayBuffer(2, 3, 5))您只能使用

打印索引
m._2.foreach(println _)

答案 4 :(得分:0)

val a=Array(10,20,30,30,50,60,70,80)
println( a.indices.filter( a(_)%30==0 ) )