Java Compare无法正确排序包含符号的字符串
我有一个java程序,它构建一个最大堆,调用Heapify并对任何列表进行排序。目前,它将对字母表进行排序,不会出现任何问题,甚至一系列字符串,如Java Compare无法正确排序包含符号的字符串,java,algorithm,sorting,unicode,Java,Algorithm,Sorting,Unicode,我有一个java程序,它构建一个最大堆,调用Heapify并对任何列表进行排序。目前,它将对字母表进行排序,不会出现任何问题,甚至一系列字符串,如apple、addle、azzle,也不会出现任何问题。下面是程序输入的屏幕截图,它获取第一行要排序的项目数及其下面的列表: 绿色是我知道已经正确排序的输入。如果选中,可以看到绿色列表的排序正确。但是,我的程序输出不正确(白色) 下面是我的Heapify()代码片段: 忽略该方法开头的条件,您可以看到我对字符串的比较只是与java中的标准String
apple、addle、azzle
,也不会出现任何问题。下面是程序输入的屏幕截图,它获取第一行要排序的项目数及其下面的列表:
绿色是我知道已经正确排序的输入。如果选中,可以看到绿色列表的排序正确。但是,我的程序输出不正确(白色)
下面是我的Heapify()代码片段:
忽略该方法开头的条件,您可以看到我对字符串的比较只是与java中的标准String.compareTo()
进行的。为什么不能对包含符号的字符串进行正确排序?请注意,我不需要自定义比较器,我只需要对字符串中包含的符号(键盘上的任何符号)进行unicode表示的求值。compareTo
的javadoc如下所示:
按字典顺序比较两个字符串。比较基于字符串中每个字符的Unicode值。此字符串对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。如果此字符串对象按字典顺序位于参数字符串之前,则结果为负整数。如果此字符串对象按字典顺序跟随参数字符串,则结果为正整数。如果字符串相等,则结果为零;当equals(Object)方法将返回true时,compareTo将返回0
声明它使用unicode,对我的问题有什么建议吗
测试文件(已排序):
代码文件:,您使用的是
compareTignoreCase
,其中状态:
此方法返回一个整数,其符号是调用compareTo与字符串的规范化版本,其中大小写差异已通过对每个字符调用Character.toLowerCase(Character.toUpperCase(Character))消除
因此,在您的示例中,“]”和“n”确实在“y”之前。您使用的是
compareTignoreCase
,其中:
此方法返回一个整数,其符号是调用compareTo与字符串的规范化版本,其中大小写差异已通过对每个字符调用Character.toLowerCase(Character.toUpperCase(Character))消除
因此,在您的示例中,“]”和“n”确实在“y”之前。您没有使用
compareTo()
,而是使用compareToIgnoreCase()
,这说明每个字符都转换为大写,然后该字符转换为小写
字符串的第六个字母不同,分别是
Y
、n
和]
。按照文件规定进行转换后,字符为y
、n
和]
。因此字符串按字典顺序排列为]
,n
,Y
您没有使用compareTo()
,而是使用compareToIgnoreCase()
,这说明每个字符都转换为大写,然后该字符转换为小写
字符串的第六个字母不同,分别是
Y
、n
和]
。按照文件规定进行转换后,字符为y
、n
和]
。因此字符串按字典顺序排列为]
,n
,Y
,Y我实际上已经改为使用compareTo
,并且仍然得到完全相同的结果?因此,在没有转换的情况下,我有Y
,]
,n
,它们的字典顺序应该保持不变。@Chisx好的,发布一个,我们可以进一步检查。我已经发布了有关完整代码文件的hastebin链接,以及test.txt的链接“我发现了错误。事实证明,我仍然有一个compareToIgnoreCase()
以不同的方法在代码中使用。实际上,我已经改为使用compareTo
,并且仍然得到完全相同的结果?因此,在没有转换的情况下,我有Y
,]
,n
,它们的字典顺序应该保持不变。@Chisx好的,发布一个,我们可以进一步检查。我已经发布了有关完整代码文件的hastebin链接,以及test.txt的链接“我发现了错误。事实证明,我仍然有一个compareToIgnoreCase()
以不同的方法在代码中使用。实际上,我已经改为使用compareTo
,并且仍然得到完全相同的结果?因此,在没有转换的情况下,我有Y
,]
,n
,它们在词典编纂上应该保持相同的顺序。我实际上已经改为使用compareTo
,并且仍然得到完全相同的结果?因此,在没有转换的情况下,我有Y
,]
,n
,它们的字典顺序应该保持不变。请为您的“-1”提交一条评论,说明您对这个问题投否决票的原因,而不是进行“驾车向下投票”,请为您的“-1”提交一条评论至于你为什么要对这个问题投否决票,而不是“驾车向下投票”
//takes the maxheap(array) and begins sorting starting with the root node
public void Heapify(String[] A, int i)
{
if( i > (max_size - 2) )
{
System.out.println("\nHeapify exceeded, here are the values:");
System.out.println("max_size = " + max_size);
System.out.println("i = " + i);
return;
}
//if the l-child or r-child is going to exceed array, stop
if( (2 * i) > max_size || ((2 * i) + 1) > max_size )
return;
String leftChild = getChild("l", i); //get left child value
String rightChild = getChild("r", i); //get right child value
if ( (A[i].compareTo(leftChild) > 0) && (A[i].compareTo(rightChild) > 0) )
return; //i node is greater than its left and right child node, Heapify is done
//if left is greater than right, switch the current and left node
if( leftChild.compareTo(rightChild) > 0 )
{
//Swap i and left child
Swap( i, (2 * i) );
Heapify(this.h, (2 * i));
} else {
//Swap i and right child
Swap( i, ((2 * i) + 1) );
Heapify(this.h, ((2 * i) + 1) );
}
}