当前位置: 首页 > 知识库问答 >
问题:

Java比较不正确排序包含符号的字符串

傅翰池
2023-03-14

我有一个java程序,它可以构建一个最大堆,调用Heapify并对任何列表进行排序。目前,它将对字母表进行排序,不会出现任何问题,甚至还会列出一系列字符串,如apple、addle、azzle,也不会出现任何问题。下面是程序输入的屏幕截图,其中显示了第一行要排序的项目数及其下面的列表:

绿色是我知道已经正确排序的输入。如果检查unicode表,可以看到绿色列表的排序正确。但是,我的程序输出不正确(白色)。

下面是我的Heapify()代码的片段:

//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) );
    }

}

忽略方法开头的条件,可以看到我对字符串的比较只是与标准字符串进行的。java中的compareTo()。为什么不能对包含符号的字符串进行正确排序?请注意,我不需要自定义比较器,只需要计算字符串中包含的符号(键盘上的任何符号)的unicode表示形式。比较的javadoc如下:

按字典顺序比较两个字符串。比较基于字符串中每个字符的Unicode值。此字符串对象表示的字符序列按字典顺序与参数字符串表示的字符序列进行比较。如果此字符串对象在词典中位于参数字符串之前,则结果为负整数。如果此字符串对象按字典顺序遵循参数字符串,则结果为正整数。如果字符串相等,则结果为零;当equals(Object)方法返回true时,compareTo会准确地返回0。

声明它使用unicode,对我的问题有什么建议吗?

测试文件(已排序):test.txt代码文件:Main.java,MaxHeap.java

共有2个答案

白萧迟
2023-03-14

您正在使用compareToIgnoreCase,其中javadoc声明:

此方法返回一个整数,其符号是使用字符串的规范化版本调用compareTo,其中通过对每个字符调用Character.toLowerCase(Character.toUpperCase(字符))消除了大小写差异。

因此,在您的示例中,“]”和“n”确实在“y”之前。

翟越
2023-03-14

您没有使用compareTo(),而是使用了compareToIgnoreCase(),这说明每个字符都转换为大写,然后该字符转换为小写。

字符串的第6个字母不同,分别是Y、n和code。按照文件规定进行转换后,字符为y、n和code。因此字符串按字典顺序排列为]nY

 类似资料:
  • 我的列表中有这样一个< code>compareTo代码: 当我使用时,我得到以下错误: 当我将其更改为<code>if(this.long1 现在,重复确实发生了,需要正确排序。重复项是出现在第一个还是最后一个并不重要,只要它们按顺序正确分组,如下所示: 我该如何正确地做到这一点?谢谢你。 更新 该列表仍在按以下所有建议排序。这是因为它是一个

  • 我有字符串数组:15MB、12MB、1TB、1GB。我想通过遵循MB小于GB和TB的规则来对它们进行词典比较。所以最后我想得到:12MB,15MB,1GB,1TB。我找到了一个比较字母的方法: 我在考虑用数字和字母拆分字符串,但我如何用字母“MB”对它们进行排序。然后根据他们的数字。我是使用两个比较器还是其他什么?

  • 在引入比较器之前,输出是: 此代码生成的输出为: 我希望它产生的输出是: 编辑:为澄清而编辑。数组已更改,并在添加比较器之前输出。

  • 此项目是一个可编辑的字典程序。我正在尝试循环浏览已添加到词典中的单词,并将用户通过扫描仪输入的单词与已添加的单词进行比较。我的问题是,无论输入多么准确,我创建的异常总是被调用。我不确定异常是否错误,或者字符串是否比较不正确。字典中的单词是从一个名为“dictionary.txt”的文件中读取的。如果有帮助,程序将使用输入/输出。这是代码。。。。请帮忙!!

  • 问题内容: 我有默认的字符串比较器(在SortedSet中)有问题。问题是默认比较器不能对包含数字的好的字符串进行排序,即:在集合中,我具有: 自然排序应该与上面类似,但是在集合中我有: 我知道为什么会这样,但是我不知道如何更改它。 问题答案: 尝试使用此比较器,该比较器将删除所有非数字字符,然后将其余字符与数字进行比较: 这是一个测试: 输出: 当数字为小数时(也表示Java 8+样式): 结果

  • 问题内容: 更新:我应该早点指定它,但是并非所有名称都只是浮点数。例如,其中一些以“ YT”为前缀。因此,例如“ YT1.1。所以,您遇到相同的问题,YT1.9 <YT1.11应该为真。我真的很惊讶字符串比较失败…。 您好,这应该是一个非常简单的问题,但我似乎找不到答案。我想按名称对一堆XL工作表进行排序。每个名称都是数字,但与教科书“节”的编号方式相同,这意味着第4.11节在4.10之后,在4.