【问题标题】:Sorting Strings using Collections.sort?使用 Collections.sort 对字符串进行排序?
【发布时间】:2015-04-12 20:42:48
【问题描述】:

我正在尝试使用 collection.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;
    }
});

【问题讨论】:

  • 是的,有问题。尝试编译它,看看它说了什么,
  • 我能看到的唯一问题是ab 是否有可能成为null。您还应该只在字符之间执行 1 次比较并存储该结果。
  • @Obicere:事实上它只对第一个字符进行排序。一般来说,字符串是按字典顺序排序的。
  • 为什么不使用普通的Collections.sort() 方法呢?无论如何,这将按字典顺序对字符串进行排序。见docs.oracle.com/javase/7/docs/api/java/lang/…
  • 编译后出现“错误的操作数类型错误”。我认为可以使用 ">" 、 "

标签: java string sorting


【解决方案1】:

String 实现了一个Comparable&lt;String&gt;,它被实现为一个字典比较,换句话说,默认情况下"Apple".compareTo("Orange") &lt; 0。所以默认就足够了。

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

Collections.sort(mailbox.getMessages());

关于你自己的实现:

您不应该使用String.valueof 转换回字符串:您可以将chars 与&lt; 进行比较,但您不能在Strings 上使用此运算符。此外,您的实现不是递归:如果两个 first 字符相等,这并不意味着 String 是相等的本身,例如"Apple""Ambiguous"。所以你必须实现一个更复杂的比较器。

【讨论】:

  • 谢谢!我误读了 API,我没有看到 compareTo() 是 lexographic
【解决方案2】:

您无法将 String 与符号 &gt; 进行比较。你可以简单地做:

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

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

【讨论】:

  • 那为什么不直接Character.compare(a.charAt(0), b.charAt(0))呢?
猜你喜欢
  • 2017-03-05
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2012-07-15
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多