Java 哈夫曼树代码 "Decode" 方法无效
Java Huffman tree code "Decode" method not working
我研究这个方法有一段时间了,我很确定这是一个简单的解决方案。在我的一生中,我无法弄清楚为什么每当我传递 [false, true, true, false, false, false, false, false, true, true, false, true, false, true, false, false, true, true, false, false, true, true, true, false, true, true]
的布尔数组时我的代码 returns strin
。出于某种原因,'g' 从未进入字符串,我似乎无法弄清楚为什么。
public String decodeIter(boolean[] coding)
{
String str = "";
Node current = root;
int i = 0;
while(i < coding.length)
{
if(current != null)
{
if(current.left == null && current.right == null)
{
LeafNode leaf = (LeafNode) current;
str += leaf.data;
current = root;
} else {
if(coding[i] == true)
{
current = current.right;
i++;
} else {
current = current.left;
i++;
}
}
}
}
return str;
}
如有任何帮助,我们将不胜感激。
问题将是,当您阅读编码中的最后一个条目并将您定向到您的角色时,您会立即 i++,这将使循环中的 while 条件为假,因此最后一个 str+= 永远不会被调用是因为它的条件从未被测试过。可能有更清洁的补救措施,但一种方法是在 return str
.
之前插入以下内容
if(current!= null && current.left == null && current.right == null)//short circuit prevents dereferencing null pointer
{
LeafNode leaf = (LeafNode) current;
str += leaf.data;
//no need to set current = root, we are leaving anyway
}
那应该为您抓取最后一个字符。
我研究这个方法有一段时间了,我很确定这是一个简单的解决方案。在我的一生中,我无法弄清楚为什么每当我传递 [false, true, true, false, false, false, false, false, true, true, false, true, false, true, false, false, true, true, false, false, true, true, true, false, true, true]
的布尔数组时我的代码 returns strin
。出于某种原因,'g' 从未进入字符串,我似乎无法弄清楚为什么。
public String decodeIter(boolean[] coding)
{
String str = "";
Node current = root;
int i = 0;
while(i < coding.length)
{
if(current != null)
{
if(current.left == null && current.right == null)
{
LeafNode leaf = (LeafNode) current;
str += leaf.data;
current = root;
} else {
if(coding[i] == true)
{
current = current.right;
i++;
} else {
current = current.left;
i++;
}
}
}
}
return str;
}
如有任何帮助,我们将不胜感激。
问题将是,当您阅读编码中的最后一个条目并将您定向到您的角色时,您会立即 i++,这将使循环中的 while 条件为假,因此最后一个 str+= 永远不会被调用是因为它的条件从未被测试过。可能有更清洁的补救措施,但一种方法是在 return str
.
if(current!= null && current.left == null && current.right == null)//short circuit prevents dereferencing null pointer
{
LeafNode leaf = (LeafNode) current;
str += leaf.data;
//no need to set current = root, we are leaving anyway
}
那应该为您抓取最后一个字符。