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)
也许我应该提出一个新问题?
答案 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
})
我认为这就是我想要的第二部分。受到汤姆斯答案的启发。