val test = List[Int](50, 115, 200, 50, 30, 22, 175, 350, 5000)

Если у меня есть такой список, и я хочу уменьшить его, чтобы любые значения в пределах 50 друг от друга считались дубликатами, но я хочу сохранить одно из значений.

У меня есть это прямо сейчас, но это убрало все те в пределах 50 друг от друга, где я хочу держать самый высокий каждый раз.

test.filter(x => !test.exists(v => if(v == x) false else Math.abs(v - x) < 50));
List(115, 350, 5000)

Так что в идеале этот список должен включать 50 и 200.

РЕДАКТИРОВАТЬ: я на самом деле в конечном итоге хотел сделать это для карты.

val tmap = Map[String, String]("57" -> "550", "145" -> "2000", "85" -> "78", "40" -> "8556")

Где я хочу посмотреть на все ключи в пределах 50, а затем получить тот, который имеет наибольшее значение числа каждый раз, когда они находятся в этом диапазоне. Любой не в пределах диапазона я держу также. Я хотел бы привести здесь, чтобы быть.

Map(145 -> 2000, 40 -> 8556)

Может быть, я должен сделать новый вопрос?

0
ozzieisaacs 24 Апр 2017 в 19:46

2 ответа

Лучший ответ

Это то, что вы после?

val res = test.sorted.foldRight(List[Int]()) {
  (z, l) =>
    if (l.isEmpty) List(z)
    else if (l.head - z > 50) z +: l
    else l
}

Вывод: List(50, 115, 200, 350, 5000)

2
Tom 24 Апр 2017 в 16:58
myMap
  .toSeq
  .sortWith(_._1.toLong < _._1.toLong)
  .foldLeft(Seq[(String, String)])((x, y) => {
    if(x.isEmpty) y +: x
    else if(Math.abs(x.last._1.toLong - y._1.toLong) < 50) {
      if(x.last._2.toLong < y._2.toLong) y +: x.dropRight(1)
      else x
    }
    else y +: x
  })

Я думаю, что это делает то, что я хочу для второй части моего вопроса. Вдохновленный Томс ответами выше.

0
ozzieisaacs 24 Апр 2017 в 20:21