Scala groupBy: хотите, чтобы индексы массива соответствовали предикату, а не значениям массива - PullRequest
2 голосов
/ 15 сентября 2011
    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 ]

8 голосов
/ 15 сентября 2011
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 this:

val m = Array(10, 20, 30, 30, 50, 60, 70, 80).zipWithIndex.partition(s =>
  s._1 % 30 == 0)._1.unzip._2
6 голосов
/ 16 сентября 2011

Вот еще один способ сделать это:

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)
6 голосов
/ 15 сентября 2011
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)
1 голос
/ 15 сентября 2011

Вот более прямой путь,

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 _)
0 голосов
/ 01 мая 2019
val a=Array(10,20,30,30,50,60,70,80)
println( a.indices.filter( a(_)%30==0 ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...