2015-04-12 259 views
3

我正在尝试使用collection.sort()方法对两个字符串进行排序,但是我遇到了理解实现逻辑的问题。这是我到目前为止。我的实施有任何问题吗? 注:我想他们按字母顺序排序: “苹果”>“橙色”使用Collections.sort对字符串进行排序?

Collections.sort(mailbox.getMessages() , (String a, String b) -> { 
    if (String.valueOf(a.charAt(0)) > String.valueOf(b.charAt(0))) { 
     return -1; 
    } 
    else if (String.valueOf(a.charAt(0)) < 
     String.valueOf(b.charAt(0))) { 
     return 1; 
    } 
    else { 
     return 0; 
    } 
}); 
+1

是的,有问题。尝试编译它,看看它说什么, –

+0

唯一的问题,我可以看到是否如果'a'或'b'有可能是'null'。您还应该只在字符之间执行1次比较并存储结果。 – Obicere

+0

@Obicere:它只是对第一个字符进行排序。一般来说,字符串是按字典排序的。 –

回答

5

String实现Comparable<String>其被实现为辞书比较,换句话说,默认情况下"Apple".compareTo("Orange") < 0。所以默认就足够了。

现在Collections.sort有一个变种,借此比较进去,你可以这样简单地使用:

Collections.sort(mailbox.getMessages()); 

关于自己的实现:

你不应该使用String.valueof投回字符串:您可以将char s与<进行比较,但不能在String s上使用此运算符。而且你执行不递归:如果两个第一字符都是平等的,这并不意味着String的相等本身,例如"Apple""Ambiguous"。所以你必须实现一个更复杂的比较器。

+1

谢谢!我误读了API,并没有看到compareTo()是词法 – Shan

3

你不能用符号>比较String。你可以简单地做:

Collections.sort(mailbox.getMessages(), (String a, String b) -> { 
    return Character.compare(a.charAt(0), b.charAt(0)); 
}); 

请注意,这将只根据第一个字符进行排序。如果你想用词法分类整个字符串值,那么你可以简单地使用Collections.sort(mailbox.getMessages()),因为String已经实现了Comparable

+1

为什么不只是'Character.compare(a.charAt(0),b.charAt(0))'呢? – Obicere

+0

@Obicere没错,我编辑过。 –

相关问题