【问题标题】:HashMap for Huffman Tree哈夫曼树的 HashMap
【发布时间】:2014-03-09 18:19:59
【问题描述】:

我有一个处理霍夫曼树的任务。我的教授提到我们应该使用 HashMap,但没有解释任何关于它们的内容。我已经查找了有关它们的信息,但在我的代码中遇到了它们的问题。这些是我收到的错误消息。

n00832607.java:542: error: incompatible types
for(Map.Entry e : charCounts.entrySet())
                                    ^
required: Entry
found:    Object
n00832607.java:610: error: incompatible types
for(Map.Entry entry : codeTable.entrySet())
                                       ^
required: Entry
found:    Object

所以我可以说它希望它返回一个条目,但我不确定如何处理这个问题。我应该把它当作某种东西吗?

这是我的代码。

//Beging Huffman Class
class Huffman{

Tree tree;

TreeMap codeTable;


protected HashMap calculateFrequency(String message)
{

int messageLength = message.length();
char ch;
int count;
HashMap charCounts = new HashMap();

for(int i = 0; i< messageLength; i++)
{

ch = message.charAt(i); 

if(charCounts.containsKey(ch))
{
count = (int) charCounts.get(ch);
++count;
charCounts.put(ch, count);   
}

else
{
charCounts.put(ch, 1);
}
}
//end for
return charCounts;
}
//end calculateFrequency

protected void createHuffmanTree(String message)
{
HashMap charCounts = calculateFrequency(message);
PriorityQueue trees = new PriorityQueue();
Tree temp;

for(Map.Entry e : charCounts.entrySet())
  {

  temp = new Tree((char)e.getKey(), (int)e.getValue());
  trees.add(temp);

  }


while(trees.size() > 1)
  {
  temp = new Tree((Tree)trees.remove(), (Tree)trees.remove());
  trees.add(temp);   
  }
tree = (Tree)trees.remove();      

}
//end createHuffmanTree

//Begin displayCodeTable
public void displayCodeTable()
{

System.out.println("Character Code");

for(Map.Entry entry : codeTable.entrySet())
  {
  char key = (char)entry.getKey();
  System.out.println(key + "" + entry.getValue());
  }
}
//End displayCodeTable 

【问题讨论】:

    标签: java encoding hashmap huffman-code


    【解决方案1】:

    只是花哨的新 Java 语法(从 Java 5 或 6 开始可用,我忘了)不是很友好。

    在过去,您必须这样做:

        TreeMap map = new TreeMap();
        Iterator itr = map.entrySet().iterator();
        while (itr.hasNext())
        {
            E thing = (E)itr.next();            
        }
    

    您可以通过使用 键入 TreeMap 并使用 keySet() 而不是 entrySet() 来解决此问题。
    那就是:

        TreeMap map = new TreeMap<String, String>();  (or whatever types you're mapping)
    

    如果你想快速修复,使用这个:

        for (Object o : map.entrySet()) {
           Map.Entry me = (Map.Entry)o;  
        }
    

    【讨论】:

    • 感谢您的回复,这两个答案都帮助我解决了我的问题,我的程序现在正在编译。我只需要确定它是否真的按照我想要的方式工作。
    【解决方案2】:

    使用泛型来指定集合中使用的键和值的类型。比如

    HashMap

    是将字符映射到整数的哈希映射。您不能在泛型中使用原始类型(int、char、long、short、byte),因此请改用类包装器(Integer、Character、Long、Short、Byte)。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多