如何按时间和相似度对列表进行排序?

时间:2013-05-16 12:44:58

标签: java sorting comparator similarity

我想对对象列表进行排序。每个对象都有一个属性year和一个属性name。需要对Java List进行排序。

类别:

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
2001年

jessica < micael,因为在2002年有一个记录迈克尔(匹配micael与相似度量,如编辑距离)。 此外,Paul P. < jessica因为在2000年,我们也有保罗记录。而paul records > Peter因为在2001年还有保罗P.记录。

我知道Jaro Winkler,Levenshtein等相似性指标,这些也在我的代码中按预期工作。问题是如何订购这个列表有关这两个维度以及如何使用比较器实现这一点(甚至可以使用简单的比较器?)

3 个答案:

答案 0 :(得分:1)

这类问题有很多解决方案。您有评论建议您实施可比较的。但是对于多维排序,我更喜欢有两个独立的比较器,我用它们按顺序对列表进行排序。通过稳定的排序,这可以根据需要订购您的物品。您最后按最重要的属性排序,因此您希望按名称排序,然后按年份排序。或者(并且更有效),您可以使用com.google.common.collect.Ordering。这是Guava library(一个伟大的),基本上是一个超级比较器。以下是您可以使用它的方法:

Comparator<MyObject> compareByYear = ...
Comparator<MyObject> compareByLevenshteinDistance = ...

Ordering<MyObject> orderByYear = Ordering.from(compareByYear);
Ordering<MyObject> compoundOrdering = orderByYear.compound(compareByLevenshteinDistance);

Collections.sort(myList,compoundOrdering);

请注意,您可以直接创建订单。我分别创建了它们,以说明Ordering是对比较器的增强。希望这有帮助!

答案 1 :(得分:0)

如果您正在使用Collections.sort()

,请尝试使用List

例如:

List<String> test = new ArrayList<>();

    test.add("one");
    test.add("first");

    Collections.sort(test);

    for (String output : test) {
        System.out.println(output);
    }

输出&#34; First&#34;然后&#34;一个&#34;。

答案 2 :(得分:0)

使用Collections.sort(列表,比较器)并实现合适的比较器。

由于您未提供班级的详细信息,因此答案也只能在元级别。