2013-05-16 50 views
0

我想排序对象的列表。每个对象都有一个属性year和一个属性name。 Java列表需要排序。如何按时间和相似性对列表进行排序?

类:

public class Record { 
    String name; 
    int year; 
} 

举个例子,假设我们有以下的记录(已经由属性年订购):

对象/记录:

2000 Paul 
2000 Peter 
2000 paul 
2001 Paul P. 
2001 micael 
2001 jessica 
2002 Michael 

因为在一年内有多个记录,我想按名称排序,这样si类似名称显示为一个组。因此,分类后,列表应如下所示:

所需的输出:

2000 Peter 
2000 Paul 
2000 paul 
2001 Paul P. 
2001 jessica 
2001 micael 
2002 Michael 

在2001年jessica < micael,因为在2002年有记录迈克尔(其中具有相似性匹配米卡埃尔指标如编辑距离)。 此外,Paul P. < jessica因为在2000年,我们也有保罗记录。而paul records > Peter因为在2001年还有一个保罗体育的记录。

我知道相似度指标,如哈罗温克勒,莱文斯坦等这些也按预期在我的代码中。问题是如何排序名单关于两个维度,以及如何用比较实现这个(是它甚至有可能用一个简单的比较?)

+0

让相关类实现Comparable接口,并在重载的compareTo方法中包含您的排序实现,然后使用Collections#sort排序它们的列表。这类问题每天都会被问到。在提问前先做一点调查工作。 – mre

+0

确定'2000 Peter'在'2000 Paul'之前列出的逻辑是什么?如果没有一些明确的逻辑,你可以把它放在文字中,我看不出有用的东西。 –

+0

@AndrewThompson谢谢你,我现在在最初的问题中解释了这一点。 2000年Peter在2000年之前被列入保罗,因为在2001年,Paul P.也有记录(如果使用字符串相似性度量,Paul会与保罗相匹配)。因此,订单不是字母。它取决于以下/以前的记录。 – Spiegelritter

回答

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); 
    } 

将输出“第一”然后“一”。

0

使用Collections.sort(列表中,比较器)和执行一个合适的比较器。

由于您没有提供课程的详细信息,因此答案也只能在元级别上进行。

+0

谢谢,我添加了更多信息并进一步解释了记录的排序。 – Spiegelritter

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); 

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

+0

谢谢。我试图按照你所描述的来实现它。但是,有一个关于“compareByLevenshteinDistance”比较器的问题。比较器返回一个负值,零或一个正值。相似性分数为[0,1],即我可以决定何时必须返回0.在其他情况下,不清楚返回的内容(如果我返回stringA.compareTo(stringB),它将按字母顺序排序,但这不一定正确,订单取决于前后的记录。 – Spiegelritter

相关问题