簡體   English   中英

具有霍夫曼樹的優先級隊列

[英]Priority Queues with Huffman tree

我試圖通過讀取文件並計算每個字母空格符號的頻率等來創建一個霍夫曼樹。我正在使用Priorityqueue將項目從最小到最大排隊但是當我將它們插入隊列時它們不能正確排隊這是我的代碼。 包霍夫曼;

import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.PriorityQueue; import 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,頻率等級為此。 public class Frequency實現Comparable {private String s; 私人的

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

}

如何獲得優先級使用頻率編號將它們從最小到最大排隊?

實際上你錯過了實現compareTo方法來使你的對象有效地進行比較。

compareTo方法,如文檔所述,應該

返回負整數,零或正整數,因為此對象小於,等於或大於指定對象。

這意味着在您的情況下,您應該執行以下操作:

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

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

但是請注意,可比類型具有更優選的泛型類型: Comparable<T>因此您可以避免在arg0上進行arg0轉換,使其成為具有靜態類型安全性的Frequency對象:

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

我認為“自動生成的方法存根”需要填充“compareTo”的實際實現,以滿足可比較的東西的要求,我認為PriorityQueue將依賴它。 實現可能是“n <arg0”,並從Object進行適當的向下轉換。

優先級隊列 ,就像數據結構一樣,基於排序的概念 - 當您想要以某種方式排序元素時,您使用這樣的結構 - 哪些元素比其他元素更重要,等等。

在Java中,排序對象通常以兩種方式之一完成 - 您的對象實現Comparable接口,或者您提供Comparator<E> ,它知道如何訂購E類型的對象。

要確定哪個對象比另一個對象“更重要”,將調用compareTo()方法。 這個方法有一個非常簡單的合同:

將此對象與指定的對象進行比較以獲得順序。 返回負整數,零或正整數,因為此對象小於,等於或大於指定對象。

您的Frequency.compareTo()始終返回0以進行比較。 因此,您指定所有Frequency對象都等於任何其他Frequency對象。 這顯然不是你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM