去重案例列表 class
Dedup List of case class
我有一个案例列表 class :
case class MyClass(id1: String, id2: String, nb: Int)
val myList = List(
MyClass("id1", "id2", 3),
MyClass("id3", "id4", 4),
MyClass("id2", "id1", 3), // <- Delete this one (dedup with MyClass("id1", "id2", 3))
MyClass("id4", "id2", 4), // <- Delete this one (dedup with MyClass("id2", "id4", 4))
MyClass("id5", "id6", 12)
)
myList.foldLeft(List[MyClass]()) {
(acc, elem) =>
if (myList.contains(MyClass(elem.id2, elem.id1, elem.nb))) {
acc
} else {
acc :+ elem
}
}
如果 id1
和 id2
使用相同的 nb
值反转(如代码注释中所述),我想删除重复项
我试过 foldLeft
但速度很慢(我的列表有 400k+ 个条目)
有人对此用例有神奇的解决方案吗?
谢谢!
如果仅考虑 id 的相等性 - 一种选择是对“有序”元组使用 distinctBy
:
val result = myList.distinctBy(c => if (c.id1 > c.id2) (c.id1, c.id2) else (c.id2, c.id1))
对于应该考虑所有三个成员的情况 - 我会在 MyClass
中“重新排序”id 并使用 distinct
:
val result = myList.map {
case MyClass(id1, id2, v) if id1 > id2 => MyClass(id2, id1, v)
case c => c
}.distinct
我有一个案例列表 class :
case class MyClass(id1: String, id2: String, nb: Int)
val myList = List(
MyClass("id1", "id2", 3),
MyClass("id3", "id4", 4),
MyClass("id2", "id1", 3), // <- Delete this one (dedup with MyClass("id1", "id2", 3))
MyClass("id4", "id2", 4), // <- Delete this one (dedup with MyClass("id2", "id4", 4))
MyClass("id5", "id6", 12)
)
myList.foldLeft(List[MyClass]()) {
(acc, elem) =>
if (myList.contains(MyClass(elem.id2, elem.id1, elem.nb))) {
acc
} else {
acc :+ elem
}
}
如果 id1
和 id2
使用相同的 nb
值反转(如代码注释中所述),我想删除重复项
我试过 foldLeft
但速度很慢(我的列表有 400k+ 个条目)
有人对此用例有神奇的解决方案吗?
谢谢!
如果仅考虑 id 的相等性 - 一种选择是对“有序”元组使用 distinctBy
:
val result = myList.distinctBy(c => if (c.id1 > c.id2) (c.id1, c.id2) else (c.id2, c.id1))
对于应该考虑所有三个成员的情况 - 我会在 MyClass
中“重新排序”id 并使用 distinct
:
val result = myList.map {
case MyClass(id1, id2, v) if id1 > id2 => MyClass(id2, id1, v)
case c => c
}.distinct