使用Collections.sort对字符串进行排序?

3

我正在尝试使用collection.sort()方法对两个字符串进行排序,但我不太理解实现的逻辑。这是我目前的代码。请问我的实现有什么问题吗? 注意:我想按字母顺序排序: "Apple" > "Orange"

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
是的,有一些问题。尝试编译它并查看它所说的内容。 - Paul Boddington
我能看到的唯一问题是如果ab有可能为null。您还应该仅对字符执行1次比较并存储该结果。 - Obicere
@Obicere: 而且它只按照第一个字符排序的事实。一般来说,字符串是按字典顺序排序的。 - Willem Van Onsem
4
为什么不使用简单的Collections.sort()方法?那样会按字典顺序对字符串进行排序。请参见https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo%28java.lang.String%29 - DNA
编译后我遇到了“错误的操作数类型”问题。我原以为字符的 int 值可以使用 ">"、"<" 等进行比较。 - Shan
显示剩余5条评论
2个回答

5

String实现了Comparable<String>接口,通过字典顺序进行比较,默认情况下"Apple".compareTo("Orange") < 0,因此默认就足够了。

现在Collections.sort有一个考虑此比较器的变量,因此您可以简单地使用:

Collections.sort(mailbox.getMessages());

关于您自己的实现:

您不应该使用String.valueof来将其转换回字符串:您可以使用<比较char,但是您不能在String上使用此运算符。此外,您的实现不是递归的:如果两个第一个字符相等,那并不意味着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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接