【问题标题】:Priority Queues with Huffman tree具有霍夫曼树的优先级队列
【发布时间】:2011-03-19 07:32:54
【问题描述】:

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

导入 java.io.FileNotFoundException; 导入 java.io.FileReader; 导入 java.util.ArrayList; 导入 java.util.PriorityQueue; 导入 java.util.Scanner;

公共类霍夫曼 {

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

}

如何获得优先队列以使用频率数将它们从最小到最大排队?

【问题讨论】:

    标签: java queue huffman-code


    【解决方案1】:

    实际上您错过了实现compareTo 方法以使您的对象有效地进行比较。

    compareTo 方法,如文档所述,应该

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

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

    public int compareTo(Object arg0)
    {
      Frequency other = (Frequency)arg0;
    
      return n < other.n ? -1 : (n == other.n ? 0 : 1);
    }
    

    但请注意,comparable 有一个更可取的泛型类型:Comparable&lt;T&gt;,因此您可以避免对 arg0 进行强制转换,使其成为具有静态类型安全性的 Frequency 对象:

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

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案2】:

    我认为“自动生成的方法存根”需要用“compareTo”的实际实现来填充,以满足可比较事物的要求,我假设 PriorityQueue 将依赖它。实现可能是“n

    【讨论】:

      【解决方案3】:

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

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

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

      将此对象与指定对象进行比较以进行排序。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多