2017-11-10 356 views
0

我有一個java程序,它構建一個最大堆,調用Heapify並對任何列表進行排序。目前它將排序字母沒有問題,甚至像apple, addle, azzle這樣的字符串列表沒有問題。下面是輸入的截圖程序,這需要項目的數量在第一線進行梳理,並在它下面的列表:Java比較要正確排序包含符號的字符串

enter image description here

綠色是輸入,我知道已經正確排序。如果您檢查unicode table,則可以看到綠色列表已正確排序。但是我的程序輸出不正確(白色)。

下面是我的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)); 
    } 

} 

忽略的方法開始的情況下,你可以看到我的字符串的比較簡單的發生與標準String.compareTo()在Java 。爲什麼不能正確地對包含符號的字符串進行排序?請注意,我不需要自定義比較器,我只需要包含在字符串中的符號(鍵盤上的任何符號)就可以用它們的unicode表示進行評估。用於compareTo的javadoc的內容如下:

按字母順序比較兩個字符串。該比較基於字符串中每個字符的Unicode值。由該String對象表示的字符序列按字典順序與參數字符串表示的字符序列進行比較。如果此String對象按照字典順序排列在參數字符串之前,那麼結果爲負整數。如果此String對象按照字典順序跟隨參數字符串,則結果爲正整數。如果字符串相等,結果爲零;當equals(Object)方法返回true時,compareTo返回0。

說明它使用unicode,對我的問題有什麼建議嗎?

測試文件(已排序):test.txt 代碼文件:Main.javaMaxHeap.java

+0

請爲你的「-1」提交一個評論,說明你爲什麼低估這個問題,而不是做一個「驅動器downvote」 – Chisx

回答

2

您沒有使用compareTo(),您使用的是compareToIgnoreCase(),這說明每個字符都轉換爲大寫字母,然後該字符轉換爲小寫字母。

您的字符串在其第6個字母不同,它們是Y,n]。按照記錄進行轉換後,字符爲y,n]。所以字符串按字典順序排列爲],n,Y

+0

我實際上改爲使用'compareTo',而我仍然得到完全相同的結果?所以沒有轉換,我有'Y',''''''n',這在詞典上應該保持相同的順序.. – Chisx

+0

@Chisx好的,發佈[mcve],我們可以進一步檢查。 – erickson

+0

我已經發布了包含完整代碼文件的hastebin鏈接,以及如果使用Unix命令行將test.txt鏈接到程序「<」,可以明顯地將兩個粘貼到命令行應用程序中。 – Chisx

2

您使用compareToIgnoreCase,其中javadoc狀態:

這個方法返回一個整數,其跡象是,通過調用每個字符上的Character.toLowerCase(Character.toUpperCase(character))來調用compareTo與標準化字符串版本的區別。

因此,在您的示例中,']'和'n'確實在'y'之前。

+0

我實際上改爲使用'compareTo',而我仍然獲得完全相同的結果?所以沒有轉換,我有'Y',''''''n',這在詞典上應該保持相同的順序.. – Chisx