Scala如何在List中查找唯一項目?如何在Scala中查找列表中的唯一項目
回答
這樣做是使用一個Set
作爲輔助數據結構的最有效的保序方式:
def unique[A](ls: List[A]) = {
def loop(set: Set[A], ls: List[A]): List[A] = ls match {
case hd :: tail if set contains hd => loop(set, tail)
case hd :: tail => hd :: loop(set + hd, tail)
case Nil => Nil
}
loop(Set(), ls)
}
我們可以使用隱式轉換將其包裝成一些更好的語法:
implicit def listToSyntax[A](ls: List[A]) = new {
def unique = unique(ls)
}
List(1, 1, 2, 3, 4, 5, 4).unique // => List(1, 2, 3, 4, 5)
如果你指的是Rosetta Code: Create a Sequence of unique elements
val list = List(1,2,3,4,2,3,4,99)
val l2 = list.removeDuplicates
// l2: scala.List[scala.Int] = List(1,2,3,4,99)
由於List
是不可變的,你不會調用removeDuplicates
警告修改初始List
:(!),如this tweet提到的,這種不保留訂單:
scala> val list = List(2,1,2,4,2,9,3)
list: List[Int] = List(2, 1, 2, 4, 2, 9, 3)
scala> val l2 = list.removeDuplicates
l2: List[Int] = List(1, 4, 2, 9, 3)
對於Seq
,根據ticket 929,該方法應該在Scala2.8中可用。
在此期間,您需要定義一個特設的靜態方法爲one seen here
如果我有Seq [String]而不是List? – 2009-10-08 15:46:59
調用'toList',顯然是:)或者,如@Synesso提議的那樣,使用'foldLeft'。 – incarnate 2011-10-24 13:22:23
一個簡單的ad-hoc方法只是添加到列表中的設置,並使用從那裏:
val l = List(1,2,3,3,3,4,5,5,6,7,8,8,8,9,9)
val s = Set() ++ x
println(s)
產地:
> Set(5, 1, 6, 9, 2, 7, 3, 8, 4)
這適用於一個SEQ(或任何可迭代),但這並不是必需在2.8,其中removeDuplicates方法將可能是更具有可讀性。此外,不確定運行時性能與更深思熟慮的轉換。
另外,請注意丟失的順序。
推出自己的uniq的過濾器,以便保留:
scala> val l = List(1,2,3,3,4,6,5,6)
l: List[Int] = List(1, 2, 3, 3, 4, 6, 5, 6)
scala> l.foldLeft(Nil: List[Int]) {(acc, next) => if (acc contains next) acc else next :: acc }.reverse
res0: List[Int] = List(1, 2, 3, 4, 6, 5)
我非常喜歡這個,因爲它允許複雜的過濾邏輯。謝謝! – incarnate 2011-10-24 13:20:32
在2.8,它是:
List(1,2,3,2,1).distinct // => List(1, 2, 3)
Imho,1和2不是列表中的唯一項目。只有3個。您從列表中創建唯一項目列表,這是不同的事情。 – 2012-05-11 20:02:33
如果這就是你想要的(通常不是),請使用: List(1,2,3,2,1).groupBy(x => x).filter(_._ 2.lengthCompare(1)== 0).keySet – moveaway00 2013-07-03 15:56:47
恕我直言,這個問題所有的解釋都是假的:
如何在Scala中找到列表獨特的項目?
鑑於此列表:
val ili = List (1, 2, 3, 4, 4, 3, 1, 1, 4, 1)
在列表中唯一的獨特產品2
。其他項目不是唯一的。
ili.toSet.filter (i => ili.indexOf (i) == ili.lastIndexOf (i))
會找到它。
大多數java/scala開發人員會將「給定列表中的唯一項目」的問題翻譯爲「給定列表中的所有不同值」而不是「在給定列表中單獨顯示的所有值」......這是你的每個答案如何解釋它,以及提問的人(誰批准了這樣的答案)。 2年後會出現什麼情況,並且在解析已經回答的問題時特別敏感? – mujimu 2012-07-02 20:04:44
@mujimu:我不記得爲什麼2年後我偶然發現了這個問題。也許sombebody關閉了一個類似的問題,確切的重複並鏈接到這裏。在尋找其他人的解決方案之前,我經常嘗試爲自己回答這些問題作爲練習;他們是否有類似或更好的解決方案,或者是否合理發佈我的作品。所以我發現其他人回答了另一個問題。在瞭解其他人如何理解這個問題後,我仍然認爲這個術語是錯誤的。一個句子的含義不應該由多數人來判斷。 – 2012-07-03 10:13:05
list.filter { x => list.count(_ == x) == 1 }
- 1. 如何從scala列表中按類型查找項目?
- 2. 查找並轉換一個scala列表中的項目
- 3. 在ASP列表中查找唯一標識符從選定的項目查找
- 4. Python列表中的唯一項目
- 5. 查找兩個列表(Scala)中的常見項目
- 6. 查找列表中的唯一元素
- 7. Python查找另一個列表中的列表中的項目
- 8. 查找列表中的項目存在於另一個列表
- 9. Android中的項目列表中獲取唯一的項目ID
- 10. Scala:如何檢查所有項目在Seq中是否是唯一的?
- 11. 查找B列中每個項目的唯一值數量
- 12. 在awk中查找兩行中的唯一項目
- 13. 從列表中獲取唯一項目?
- 14. 如何使用散列查找唯一項目
- 15. 在excel中查找項目列表
- 16. 在嵌套列表中查找項目
- 17. 如何在列表視圖中輸入唯一項目
- 18. 如何從Scala中的類列表中提取唯一元素
- 19. 在另一個列表中查找所有列出的項目
- 20. 如何統計列表中的唯一項目?
- 21. 查找列表中的最大項目
- 22. 查找列表中的項目
- 23. 查找多個列表中的項目?
- 24. 查找列表中的項目?
- 25. LINQ獲取列表中從列表中唯一項目
- 26. LINQ:查找列表中包含項目清單中的項目
- 27. 將項目列入Scala列表中?
- 28. 查找列表中唯一條目<Object[]>
- 29. 在gprolog中查找列表的唯一排列
- 30. 如何在scala中獲得Java列表的單個項目?
現在過於複雜*。斯卡拉2.7沒有更好的東西。 – 2011-07-13 14:00:22