Scala 将列表转换为在一个范围内只有一个项

Scala 将列表转换为在一个范围内只有一个项,scala,scala-collections,Scala,Scala Collections,如果我有一个这样的列表,我想缩小它,使彼此之间50以内的任何值都被认为是重复的,但我想保留其中一个值 我现在有这个,但它删除了彼此之间50以内的所有,我希望每次都保留最高的一个 val test = List[Int](50, 115, 200, 50, 30, 22, 175, 350, 5000) 在这里,我想查看50范围内的所有关键点,然后每次它们在该范围内时,都得到一个具有最高数值的关键点。任何不在我保持范围内的。我希望结果是这样的 val tmap = Map[String, Str

如果我有一个这样的列表,我想缩小它,使彼此之间50以内的任何值都被认为是重复的,但我想保留其中一个值

我现在有这个,但它删除了彼此之间50以内的所有,我希望每次都保留最高的一个

val test = List[Int](50, 115, 200, 50, 30, 22, 175, 350, 5000)
在这里,我想查看50范围内的所有关键点,然后每次它们在该范围内时,都得到一个具有最高数值的关键点。任何不在我保持范围内的。我希望结果是这样的

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

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

这就是你想要的吗

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

输出:
列表(501152003505000)
这就是你想要的吗

Map(145 -> 2000, 40 -> 8556)
输出:
列表(501152003505000)
myMap
托塞克先生
.sortWith(u.1.toLong{
如果(x.isEmpty)y+:x
else if(数学绝对值(x.last._1.toLong-y._1.toLong)<50){
如果(x.last._2.toLong
我想这正是我想回答问题第二部分的原因。灵感来自上面的Toms答案。

myMap
托塞克先生
.sortWith(u.1.toLong{
如果(x.isEmpty)y+:x
else if(数学绝对值(x.last._1.toLong-y._1.toLong)<50){
如果(x.last._2.toLong

我想这正是我想回答问题第二部分的原因。受上述Toms答案的启发。

如果您有(1、50、99、148)的问题,您希望如何处理?因为第一个在第二个的50范围内,第三个在第四个的50范围内,所以会返回1吗?你想保存哪一个?简单地创建一个x/50桶就足够了,还是你需要更具活力的东西?我想返回148@assaf mendelson你想如何处理一个有(1,50,99,148)桶的情况?因为第一个在第二个的50范围内,第三个在第四个的50范围内,所以会返回1吗?你想保存哪一个?仅仅创建一个x/50桶就足够了,还是需要更具活力的东西?我想返回148@assaf mendelson
val res = test.sorted.foldRight(List[Int]()) {
  (z, l) =>
    if (l.isEmpty) List(z)
    else if (l.head - z > 50) z +: l
    else l
}
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
  })