【问题标题】:Sort email address using compareTo() returns unexpected result使用 compareTo() 对电子邮件地址进行排序返回意外结果
【发布时间】:2020-07-04 16:30:16
【问题描述】:

我是 Java 新手,我尝试使用 compareTo() 按字母顺序对电子邮件地址进行排序,但结果并不如我所愿。我把我的问题写在代码里,你能指教吗?

public class SortTest {
    public static void main(String[] args) {
        String text1= "customer1@example.com";
        String text2 = "customer10@example.com";
        System.out.println(text1.compareTo(text2)); //Result is 16. Why? I expect a negative number as result.

        String text3= "customer1";
        String text4 = "customer10";
        System.out.println(text3.compareTo(text4)); //result is -1 which is correct.        
    }

}

更新: 我想用上面的text1和text2升序排序,按顺序的预期结果是"customer1@example.com",然后是"customer10@example.com"。你能建议如何实现它吗?

【问题讨论】:

  • '@'64'0'48。所以'@' > '0',意思是"customer1@".compareTo("customer10") > 0。有什么意外?
  • 谢谢!现在我明白为什么它返回 16。我想用上面的 text1 和 text2 升序排序,按顺序的预期结果是 customer1@example.com,然后是 customer10@example.com。你能建议如何实现它吗?
  • 那么看来你需要比较文本直到@,类似于text1.substring(0, text1.indexOf("@")).compareTo(text2.substring(0, text2.indexOf("@")))

标签: java regex string algorithm sorting


【解决方案1】:

看看javadoc

如果它们没有不同的索引位置,则较短的字符串按字典顺序位于较长的字符串之前。在这种情况下, compareTo 返回字符串长度的差值——也就是值

这解释了第二个例子。

在第一个中,“0”在字典上位于“@”之前。您可以通过运行简单地检查:

"@".compareTo("0")

这导致值16

或者其他方式:

(int) '@' // 64
(int) '0' // 48

所以差是 16。

编辑:要以您想要的方式比较电子邮件,您应该涉及更多逻辑,例如仅比较登录部分(删除由"@"分隔的域):str1.split("@")[0].compareTo(str2.split("@")[0])

【讨论】:

    【解决方案2】:

    看看 Ascii 表 - http://www.asciitable.com/index/asciifull.gif

    '@'十进制值为 64 而 '0' dec 值为 48。

    现在如果你这样做 (64-48) = 16。

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2020-07-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多