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

时间:2020-03-24 07:33:47

标签: 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";
        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"。您能建议如何实现吗?

2 个答案:

答案 0 :(得分:3)

看看javadoc

如果没有索引位置在它们之间有所不同,则较短的字符串在字典上在较长的字符串之前。在这种情况下,compareTo返回字符串长度的差-即值

这说明了第二个示例。

在字典中,第一个“ 0”在“ @”之前。您可以通过运行以下命令进行简单检查:

"@".compareTo("0")

其结果为值16

或者另一种方式:

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

所以差是16。

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

答案 1 :(得分:3)

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

'@'十月值是64 dec的“ 0”值为48。

现在,如果您选择(64-48)= 16。