我正在实现冒泡排序算法,我希望它能够接受 Integer
和 String
参数。我将所有输入转换为字符串,并使用 compareTo
方法将转换为字符串的整数与字符串进行比较。使用 compareTo
比较转换后的整数时,我得到的答案不正确。我做错了什么?
最佳答案
Integer.compareTo 按数字对数字进行排序。这就是您想要的。
String.compareTo 按字典顺序对字符串进行排序;也就是说,按字母顺序排列。
我记得在 Windows 3.1 中,我的数码相机中的照片文件夹是这样排序的:PHOTO1、PHOTO10、PHOTO100、PHOTO2、PHOTO20、PHOTO3……等等。 Windows XP 对它们的排序更符合您的预期:PHOTO1、PHOTO2、PHOTO3 等。这是因为它对表示数字的字符串有特殊的排序规则。
在字典顺序中,将一个字符串 A 中的每个字符与另一个字符串 B 中的对应字符进行比较。对于两个字符串中的每个对应字符:
- 如果 A 的当前字符在字典序上小于(在字母表中排在前面)B 的字符,则 A 排在 B 之前。
- 如果 B 的字符小于 A 的字符,则 B 在 A 之前。
- 如果这两个字符相同,那么我们还不知道。检查下一个。
- 如果其中一个字符串中没有剩余字符,则较短的字符排在较长的字符之前。
- 如果两个字符串中都没有剩余字符,则它们是同一个字符串。
这里的第四点是假设 Eddie 对您的问题的分析是正确的,为什么您会得到错误的答案。
考虑字符串“10”和“2”。字典顺序将分别查看每个字符的第一个字符“1”和“2”。在 Java 使用的字符集中,字符“1”排在“2”之前,因此它将“10”排在“2”之前,就像“bare”排在“hare”之前一样,因为“b”排在“”之前h'.
我建议您在排序之前将字符串转换为整数。使用 Integer.parseString 来执行此操作。
关于字符串和整数参数的 Java compareTo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/900745/