Java 使用compareTo()对电子邮件地址进行排序返回意外结果
我是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
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@