具有霍夫曼树的优先级队列

时间:2010-07-22 00:53:05

标签: java queue huffman-code

我正在尝试通过读取文件并计算每个字母空间符号的频率等来创建一个霍夫曼树。我正在使用Priorityqueue将项目从最小到最大排队但是当我将它们插入队列时不正确排队这里是我的代码。     包huffman;

import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.PriorityQueue; import java.util.Scanner;

公共课Huffman {

public ArrayList<Frequency> fileReader(String file)
{
    ArrayList<Frequency> al = new ArrayList<Frequency>();
    Scanner s;
    try {

        s = new Scanner(new FileReader(file)).useDelimiter("");
        while (s.hasNext())
        {
            boolean found = false;
            int i = 0;
            String temp = s.next();
            while(!found)
            {


                if(al.size() == i && !found)
                {
                    found = true;
                    al.add(new Frequency(temp, 1));
                }
                else if(temp.equals(al.get(i).getString()))
                {
                    int tempNum = al.get(i).getFreq() + 1;
                    al.get(i).setFreq(tempNum);
                    found = true;
                }
                i++;

            }



        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return al;
}
public void buildTree(ArrayList<Frequency> al)
{
    PriorityQueue<Frequency> pq = new PriorityQueue<Frequency>();
    for(int i = 0; i < al.size(); i++)
    {
        pq.add(al.get(i));          
    }
    while(pq.size() > 0)
    {
        System.out.println(pq.remove().getString());
    }
}
public void printFreq(ArrayList<Frequency> al)
{
    for(int i = 0; i < al.size(); i++)
    {
        System.out.println(al.get(i).getString() + "; " + al.get(i).getFreq());
    }
}

}

buildTree()方法中的

是我遇到问题的地方。我试图做的是队列频率对象,其中包含字母/空格/符号,频率为int,频率等级为此。    public class Frequency implements Comparable {     private String s;     private int n;

Frequency(String s, int n)
{
    this.s = s;
    this.n = n;
}
public String getString()
{
    return s;
}
public int getFreq()
{
    return n;
}
public void setFreq(int n)
{
    this.n = n;
}
@Override
public int compareTo(Object arg0) {
    // TODO Auto-generated method stub
    return 0;
}

}

如何获得优先级使用频率编号将它们从最小到最大排队?

3 个答案:

答案 0 :(得分:4)

实际上,您错过了实施compareTo方法以使您的对象有效比较。

正如文档所述,compareTo方法

  

返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。

这意味着在您的情况下,您应该执行以下操作:

public int compareTo(Object arg0)
{
  Frequency other = (Frequency)arg0;

  return n < other.n ? -1 : (n == other.n ? 0 : 1);
}

但是请注意,可比较的类型有一个更优选的通用类型:Comparable<T>因此您可以避免arg0上的强制转换,使其成为具有静态类型安全性的Frequency对象:

class Frequency implements Comparable<Frequency> {   
  public int compareTo(Frequency f2) {
    // directly compare
  }
}

答案 1 :(得分:2)

我认为“自动生成的方法存根”需要填充“compareTo”的实际实现,以满足可比较的要求,我认为PriorityQueue将依赖于此。实现可能是“n&lt; arg0”,并从Object进行适当的向下转换。

答案 2 :(得分:2)

Priority Queue,就像数据结构一样,基于排序的概念 - 当你想以某种方式对元素进行排序时,你会使用这样的结构 - 这些元素比其他人更重要,等等。

在Java中,排序对象通常以两种方式之一完成 - 您的对象实现Comparable接口,或者提供Comparator<E>,它知道如何排序E类型的对象

要确定哪个对象比另一个对象“更重要”,则调用compareTo()方法。这个方法有一个非常简单的合同:

  

将此对象与指定的订单对象进行比较。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。

Frequency.compareTo()的实现始终返回0以进行比较。因此,您指定所有Frequency个对象都等于任何其他Frequency个对象。这显然不是你想要的。