2017-11-10 4 views
0

私は最大ヒープを構築し、Heapifyを呼び出して任意のリストをソートするJavaプログラムを持っています。現在は問題のないアルファベットをソートし、問題のない文字列のリストもapple, addle, azzleとしています。JavaのcompareToは、シンボルを含む文字列を正しくソートしていません

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

} 

方法の初めに条件を無視して、あなたは文字列の私の比較は単純にJavaで標準String.compareTo()で行われていることがわかります。なぜ、シンボルを含む文字列を正しくソートできないのですか?私はカスタムコンパレータを必要としないことに注意してください。文字列に含まれているシンボル(キーボード上の任意のシンボル)をUnicode表現のために評価する必要があります。 compareToのjavadocは、次のとおりです。

2つの文字列を辞書的に比較します。比較は、文字列内の各文字のUnicode値に基づいて行われます。このStringオブジェクトによって表される文字シーケンスは、引数文字列によって表される文字シーケンスと辞書的に比較されます。このStringオブジェクトが辞書的に引数の文字列に先行する場合、結果は負の整数になります。このStringオブジェクトが辞書的に引数文字列に続く場合、結果は正の整数です。文字列が等しい場合、結果はゼロです。 compareToはequals(Object)メソッドがtrueを返すときに0を返します。

ユニコードを使用していると記載していますが、私の問題の提案はありますか?

テストファイル(すでにソート):test.txt コードファイル:Main.javaMaxHeap.java

+0

"drive-by downvote"を実行するのではなく、この質問をd​​ownvotingする理由として "-1"のコメントを送信してください – Chisx

答えて

2

compareTo()を使用していない場合は、compareToIgnoreCase()を使用しています。これは、各文字が大文字に変換され、その文字が小文字に変換されることを説明しています。

文字列の第6番目の文字は、Y,n]です。記載されている変換後、文字はy,n]です。したがって、文字列は辞書順に],n,Yのように並べられます。

+0

代わりに 'compareTo'を使って実際に変更しましたが、まったく同じ結果が得られますか?ですから変換がない場合は、辞書順に同じ順序にとどまるべき 'Y'、'] '、' n'を持っています。 – Chisx

+0

@Chisx Okay、[mcve]を投稿してください。 – erickson

+0

私は関連する完全なコードファイルへのhastebinリンクと、Unixのコマンドラインを使っているなら "<"への "<"へのリンクとしてtest.txtへのリンクを掲示しました。 – Chisx

2

あなたがでjavadoc状態compareToIgnoreCase、使用している:このメソッド

は、その記号のことである整数を返します。各文字のCharacter.toLowerCase(Character.toUpperCase(character))を呼び出して、大文字と小文字の違いが解消された文字列の正規化バージョンとcompareToを呼び出します。

あなたの例では、 ']'と 'n'は確かに 'y'の前です。

+0

私は実際には代わりに 'compareTo'を使用するように変更しました。まったく同じ結果が得られますか?ですから、コンバージョンがない場合は、辞書順に同じ順序にとどまるべき 'Y'、'] '、' n'を持っています。 – Chisx

関連する問題