我想对对象列表进行排序。每个对象都有一个属性year
和属性(property)name
。 Java 列表需要排序。
类别:
public class Record {
String name;
int year;
}
例如,假设我们有以下记录(已按属性年份排序):
对象/记录:
2000 Paul
2000 Peter
2000 paul
2001 Paul P.
2001 micael
2001 jessica
2002 Michael
因为一年内有多个记录,所以我想按名称排序,以便相似的名称显示为一组。因此,排序后,列表应如下所示:
所需输出:
2000 Peter
2000 Paul
2000 paul
2001 Paul P.
2001 jessica
2001 micael
2002 Michael
jessica < micael
2001 年,因为 2002 年有一条记录 Michael(将 micael 与编辑距离等相似性度量相匹配)。
此外,Paul P. < jessica
因为2000年的时候,我们还有保罗的记录。和paul records > Peter
因为2001年还有Paul P.的记录。
我知道 Jaro Winkler、Levenshtein 等相似性指标,这些指标在我的代码中也按预期工作。问题是如何在两个维度上对这个列表进行排序以及如何使用比较器来实现它(甚至可以使用简单的比较器吗?)
最佳答案
针对此类问题有很多解决方案。您收到一条评论,建议您实现类似的措施。然而,对于多维排序,我更喜欢有两个单独的比较器,用于按顺序对列表进行排序。通过稳定的排序,这有利于根据需要订购您的商品。您最后按最重要的属性排序,因此您需要按名称排序,然后按年份排序。或者(更有效),您可以使用 com.google.common.collect.Ordering
。它位于 Guava 库(一个很棒的库)中,基本上是一个 super 比较器。以下是您可以如何使用它:
Comparator<MyObject> compareByYear = ...
Comparator<MyObject> compareByLevenshteinDistance = ...
Ordering<MyObject> orderByYear = Ordering.from(compareByYear);
Ordering<MyObject> compoundOrdering = orderByYear.compound(compareByLevenshteinDistance);
Collections.sort(myList,compoundOrdering);
请注意,您可以直接创建订单。我单独创建它们是为了说明排序是对比较器的增强。希望这有帮助!
关于java - 如何按时间和相似度对列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16587833/