list - 在 Scala 中,根据与另一个元素的相似性来删除列表中元素的最有效方法是什么?
问题描述
我有一长串大约 300 个对象,列表中的每个对象都具有以下数据结构:
case class MyObject(id: String,
name: String,
colour: String,
price: Int
height: Int
width: Int,
desc: String)
我无法确定浏览列表的最佳方式是什么,并且对于每个对象,删除具有相同名称、颜色、价格、高度和宽度的任何其他对象。请注意,这不是简单的重复数据删除,因为 ids 和 desc 可能不同。输入和输出需要保留List[MyObject]
,我事先不知道哪些对象是重复的。
这是我最初的有效解决方案,但不确定在处理大型列表时它是最有效的方法。
def removeDuplicates(originalList: List[MyObject]): List[MyObject] = {
def loop(remaining: List[MyObject], acc: List[MyObject]): List[MyObject] = {
remaining match {
case head :: tail =>
val listOfDuplicates = tail.filter{ x =>
x.name == head.name &&
x.colour == head.colour &&
x.price == head.price &&
x.height == head.height &&
x.width == head.width
}
val deDupedTail = tail.filter(!listOfDuplicates.contains(_))
loop(deDupedTail, acc ::: listOfDuplicates)
case Nil => acc
}
}
val listOfDuplicateObjects = loop(originalList, List())
originalList.filter(!listOfDuplicateObjects.contains(_))
}
解决方案
不确定它是否最有效,但恕我直言,它很优雅:
originalList.distinctBy(o => (o.name, o.colour, o.price, o.height, o.width))
推荐阅读
- c# - 如何将 Hub 内容从任何服务器带到*另一台服务器*项目 Hub?
- python - matplotlib 中的 figsize 不会改变图形大小?
- r - 如何使用字符串连接定义聚集函数的关键参数
- android - Android 应用程序:如何向 Surface 显示连续的 RGBA 字节 [] 帧?
- html - 如何使导航栏中的引导按钮跨越整个导航栏
- python - 用于计算python中间歇croston方法的拟合值的用户定义函数
- c# - 这是处理中间件身份验证重定向逻辑的好方法吗?
- node.js - 使用 mongoose 连接到 MongoDb Atlas
- .net - Asp.Net 声称在哪里成立?
- css - 使用 SCSS 中的 Webpack 编译后,媒体查询不起作用