Java 使用compareTo()对电子邮件地址进行排序返回意外结果

Java 使用compareTo()对电子邮件地址进行排序返回意外结果,java,regex,string,algorithm,sorting,Java,Regex,String,Algorithm,Sorting,我是Java新手,尝试使用compareTo按字母顺序对电子邮件地址进行排序,但结果并不像我预期的那样。我把我的问题写在密码里了,你能告诉我吗 public class SortTest { public static void main(String[] args) { String text1= "customer1@example.com"; String text2 = "customer10@example.com"; Syste

我是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. 你能建议如何实现这一目标吗?

看一下:

如果索引位置不存在差异,则按字典顺序,较短字符串优先于较长字符串。在本例中,compareTo返回字符串长度的差值,即值

这就解释了第二个例子

在第一种情况下,0在@之前按字典顺序排列。您只需运行以下命令即可检查:

"@".compareTo("0")
这将导致值16

或者另一种方式:

(int) '@' // 64
(int) '0' // 48
所以差别是16


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

查看Ascii表-

“@”Dec值为64 而“0”的dec值为48


现在如果你做64-48=16。

“@”是64,“0”是48。所以“@”>“0”,意思是customer1@.compareTocustomer10 > 0. 有什么意外?谢谢!现在我明白为什么它返回16。我想用上面的text1和text2进行升序排序,预期的结果是customer1@example.com然后customer10@example.com. 你能建议如何实现它吗?那么你似乎需要比较文本直到@,类似于text1.substring0,text1。indexOf@.compareTotext2.substring0,text2.indexOf@