2017-04-24 25 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的啓發。