次のように PriorityQueue を使用してヒープを実装しようとしています。
PriorityQueue<Node> heap = new PriorityQueue<Node>();
Set<String> allWords = codebook.getAllWords();
for(String word : allWords)
{
heap.add(new Node(word, codebook.getProbability(word)));
System.out.println(heap.toString());
}
上記のメソッドを保持する同じクラス内のプライベート クラスとして Node を定義した場所。ノードは次のように定義されます。
private static class Node implements Comparable
{
protected Node left;
protected Node right;
protected String name;
protected double frequency;
public Node(String n, double f)
{
name = n;
frequency = f;
}
public Node(double f, Node l, Node r)
{
frequency = f;
left = l;
right = r;
}
@Override
public int compareTo(Object arg0)
{
Node other = (Node)(arg0);
if(this.frequency < other.frequency)
{
System.out.println(name + " < " + other.name);
return -1;
}
else if(this.frequency > other.frequency)
{
System.out.println(name + " > " + other.name);
return 1;
}
System.out.println(name + " is equal to " + other.name);
return 0;
}
public String toString()
{return name;}
}
ただし、ノードを PriorityQueue に追加すると、それらは頻度順に並べられません。私のprintlnステートメントからの出力に基づいて、Node.compareTo()によって正しい値が返されます。たとえば、次のデータセットがあるとします。
- 名前、頻度
- 必要、3
- 猫、1
- ニート、2
私のコードは次のように生成します:
// need
[need]を追加します
// cat
cat < need
[cat, need]を追加します
// きちんとしたニートを追加し
ます > cat
[cat、need、neat]
PriorityQueue
が [cat、きちんと、必要]
なぜこれが起こっているのかについてのヒントは?