私は最大ヒープを構築し、Heapifyを呼び出して任意のリストをソートするJavaプログラムを持っています。現在は問題のないアルファベットをソートし、問題のない文字列のリストもapple, addle, azzle
としています。JavaのcompareToは、シンボルを含む文字列を正しくソートしていません
グリーンは私が知っているすでに正しくソートされて入力されている。以下は、最初の行でソートする項目の数を取るプログラムへの入力のスクリーンショット、及びそれ以下のリストです。 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.java、MaxHeap.java
"drive-by downvote"を実行するのではなく、この質問をdownvotingする理由として "-1"のコメントを送信してください – Chisx