2017-04-24 86 views
0
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) 

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

+1

你想如何处理你有(1,50,99,148)的情况?这是否会返回一个,因为第一个是在第二个50秒内,这是在第三个50内,这是在第四个的50内?你想要保存哪一个?简单地创建一个x/50桶对你来说就足够了,还是你需要更动态的东西? –

+0

我想返回148 @ assaf-mendelson – ozzieisaacs

回答

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)

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

我觉得这个做什么,我想我的问题的第二部分。受上述Toms的启发。