变换列表只包含一个范围内的一个项目

时间:2017-04-24 16:47:00

标签: scala scala-collections

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

如果我有一个这样的列表,我想减少它,以便相互之间的任何值都被认为是重复的,但我想保留其中一个值。

我现在有这个,但它删除了每个我想要保持最高的每个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)

也许我应该提出一个新问题?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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
  })

我认为这就是我想要的第二部分。受到汤姆斯答案的启发。