0

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

班级:

public class Record {
    String name;
    int year;
}

例如,假设我们有以下记录(已经按属性 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 年有一个记录迈克尔(将 micael 与编辑距离等相似性度量相匹配)。此外,Paul P. < jessica因为在 2000 年,我们也有保罗的记录。并且paul records > Peter因为在 2001 年还有一个 Paul P. 记录。

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

4

3 回答 3

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 是 Comparator 的增强。希望这可以帮助!

于 2013-05-16T13:04:27.287 回答
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);
    }

将输出“First”然后“one”。

于 2013-05-16T12:48:31.753 回答
0

使用 Collections.sort(list, 比较器) 并实现一个合适的比较器。

由于您不提供课程的详细信息,因此答案也只能是元级别的。

于 2013-05-16T12:51:56.240 回答