huffman_test 的 Decode() 方法中的错误 --> ascii_text
Errors in Decode() method for huffman_test --> ascii_text
我是初学者 Java 程序员,我正在尝试编写一个 Decode() 方法,该方法应该采用霍夫曼树中的编码(下面包含的 Encode() 方法)huffman_text并将其解码回 ascii_text。我想我快到了,但我在编译错误方面遇到了一些麻烦,主要是关于 charAt 的使用,但不知道用什么代替 charAt 来让我的代码工作。
如果有人知道如何继续,我将不胜感激。
错误
Tree.java:96: 错误: 找不到符号
如果 (huffman_text.chartAt(i) == "1")
^
符号:方法 chartAt(int)
位置:String
类型的变量 huffman_text
Tree.java:103: 错误: 找不到符号
如果 (root.charAt(i).length() == 1)
^
符号:变量 i
位置:class 树
Tree.java:104: 错误: 找不到符号
ascii_text += root.charAt(i);
^
符号:变量 i
位置:class 树
Tree.java:105: 错误: 找不到符号
否则如果 (leaf_nodes[huffman_code] == null)
^
符号:变量 huffman_code
位置:class 树
Tree.java:107: 错误: 找不到符号
huffman_text.charAt(i));
^
符号:变量 i
位置:class 树
class Tree
{
Node root;
Node leaf_nodes[];
public void CreateLeafNodes(String ascii_text)
{
// Array of leaf nodes indexed by ASCII code
leaf_nodes = new Node[256];
// Parse text
for (int i = 0; i< ascii_text.length();i++)
{
// Get ASCII code for current character
int ascii_code = ascii_text.charAt(i);
// Create node if it does not exist
if (leaf_nodes[ascii_code] == null)
leaf_nodes[ascii_code] = new Node(ascii_code);
// Increment frequncy
leaf_nodes[ascii_code].frequency++;
}
}
public void BuildTree()
{
// Create heap
Heap heap = new Heap();
// Insert all leaf nodes
for (int i = 0; i < 256; i++)
if (leaf_nodes[i] != null)
heap.Insert(leaf_nodes[i]);
// Build tree
while(heap.GetLength() > 1)
{
// Extract 2 nodes with minimum frequency
Node left = (Node) heap.ExtractMax();
Node right = (Node) heap.ExtractMax();
// Create new node and make it the root for now
root = new Node(0);
root.left = left;
root.right = right;
root.frequency = left.frequency + right.frequency;
// Insert new node in heap
heap.Insert(root);
}
// Set Huffman codes
root.SetHuffmanCode("");
}
public String Encode(String ascii_text)
{
// Initialize result
String huffman_text = "";
// Traverse ASCII text
for (int i = 0; i < ascii_text.length(); i++)
{
// Get ASCII code
int ascii_code = ascii_text.charAt(i);
// Check if character is supported
if (leaf_nodes[ascii_code] == null)
throw new RuntimeException("Character not supported: " +
ascii_text.charAt(i));
// Get Huffman code
String huffman_code = leaf_nodes[ascii_code].huffman_code;
// Add it
huffman_text += huffman_code;
// Message
System.out.println(ascii_text.charAt(i) + " -> " + huffman_code);
}
// Result
return huffman_text;
}
public String Decode(String huffman_text)
{
// Initialize result
String ascii_text = "";
// Traverse huffman text
for (int i = 0; i < huffman_text.length(); i++)
{
while(root.left != null && root.right != null && i < huffman_text.length())
if (huffman_text.chartAt(i) == "1")
root = root.right;
else
root = root.left;
i++;
}
if (root != null)
if (root.charAt(i).length() == 1)
ascii_text += root.charAt(i);
else if (leaf_nodes[huffman_code] == null)
throw new RuntimeException("Character not supported: " +
huffman_text.charAt(i));
// Result
return ascii_text;
}
}
class Test
{
public static void main(String args[])
{
float compression;
Tree tree = new Tree();
if (args.length == 0)
throw new RuntimeException("Please enter an argument. ");
String ascii_text = args[0];
tree.CreateLeafNodes(ascii_text);
tree.BuildTree();
System.out.println(ascii_text);
String huffman_text = tree.Encode(ascii_text);
System.out.println(huffman_text);
compression = huffman_text.length() * 100/ascii_text.length();
System.out.println(compression);
String ascii_text_2 = tree.Decode(huffman_text);
}
}
我将逐一检查错误。
Error line 96
cannot find symbol if (huffman_text.chartAt(i) == "1") ^ symbol: method chartAt(int)
打字错误:调用方法 charAt()
不是 chartAt()
Error lines 103, 104 and 107
cannot find symbol { ... } ^ symbol: variable i
您在 for 循环外使用了 i
:它未在此范围内声明
Error line 105
cannot find symbol else if (leaf_nodes[huffman_code] == null) ^ symbol: variable huffman_code
huffman_code
未在任何地方声明。
这些是错误,你应该可以解决。或者至少知道该怎么做,只要看着他们。理解错误消息是编程中需要的技能!
无论如何,您的代码还有一些问题实际上也应该抛出错误消息:
if (huffman_text.chartAt(i) == "1")
在此语句中,您将 huffman_text.chartAt(i)
与 "1"
进行比较。这应该是不可能的,因为方法 charAt()
returns a char
,但是 "1"
是类型 String
.
比较这个的正确方法是只使用单引号,它代表 char
:
if (huffman_text.chartAt(i) == '1')
我是初学者 Java 程序员,我正在尝试编写一个 Decode() 方法,该方法应该采用霍夫曼树中的编码(下面包含的 Encode() 方法)huffman_text并将其解码回 ascii_text。我想我快到了,但我在编译错误方面遇到了一些麻烦,主要是关于 charAt 的使用,但不知道用什么代替 charAt 来让我的代码工作。
如果有人知道如何继续,我将不胜感激。
错误
Tree.java:96: 错误: 找不到符号 如果 (huffman_text.chartAt(i) == "1") ^ 符号:方法 chartAt(int) 位置:String
类型的变量 huffman_textTree.java:103: 错误: 找不到符号 如果 (root.charAt(i).length() == 1) ^ 符号:变量 i 位置:class 树
Tree.java:104: 错误: 找不到符号 ascii_text += root.charAt(i); ^ 符号:变量 i 位置:class 树
Tree.java:105: 错误: 找不到符号 否则如果 (leaf_nodes[huffman_code] == null) ^ 符号:变量 huffman_code 位置:class 树
Tree.java:107: 错误: 找不到符号 huffman_text.charAt(i)); ^ 符号:变量 i 位置:class 树
class Tree
{
Node root;
Node leaf_nodes[];
public void CreateLeafNodes(String ascii_text)
{
// Array of leaf nodes indexed by ASCII code
leaf_nodes = new Node[256];
// Parse text
for (int i = 0; i< ascii_text.length();i++)
{
// Get ASCII code for current character
int ascii_code = ascii_text.charAt(i);
// Create node if it does not exist
if (leaf_nodes[ascii_code] == null)
leaf_nodes[ascii_code] = new Node(ascii_code);
// Increment frequncy
leaf_nodes[ascii_code].frequency++;
}
}
public void BuildTree()
{
// Create heap
Heap heap = new Heap();
// Insert all leaf nodes
for (int i = 0; i < 256; i++)
if (leaf_nodes[i] != null)
heap.Insert(leaf_nodes[i]);
// Build tree
while(heap.GetLength() > 1)
{
// Extract 2 nodes with minimum frequency
Node left = (Node) heap.ExtractMax();
Node right = (Node) heap.ExtractMax();
// Create new node and make it the root for now
root = new Node(0);
root.left = left;
root.right = right;
root.frequency = left.frequency + right.frequency;
// Insert new node in heap
heap.Insert(root);
}
// Set Huffman codes
root.SetHuffmanCode("");
}
public String Encode(String ascii_text)
{
// Initialize result
String huffman_text = "";
// Traverse ASCII text
for (int i = 0; i < ascii_text.length(); i++)
{
// Get ASCII code
int ascii_code = ascii_text.charAt(i);
// Check if character is supported
if (leaf_nodes[ascii_code] == null)
throw new RuntimeException("Character not supported: " +
ascii_text.charAt(i));
// Get Huffman code
String huffman_code = leaf_nodes[ascii_code].huffman_code;
// Add it
huffman_text += huffman_code;
// Message
System.out.println(ascii_text.charAt(i) + " -> " + huffman_code);
}
// Result
return huffman_text;
}
public String Decode(String huffman_text)
{
// Initialize result
String ascii_text = "";
// Traverse huffman text
for (int i = 0; i < huffman_text.length(); i++)
{
while(root.left != null && root.right != null && i < huffman_text.length())
if (huffman_text.chartAt(i) == "1")
root = root.right;
else
root = root.left;
i++;
}
if (root != null)
if (root.charAt(i).length() == 1)
ascii_text += root.charAt(i);
else if (leaf_nodes[huffman_code] == null)
throw new RuntimeException("Character not supported: " +
huffman_text.charAt(i));
// Result
return ascii_text;
}
}
class Test
{
public static void main(String args[])
{
float compression;
Tree tree = new Tree();
if (args.length == 0)
throw new RuntimeException("Please enter an argument. ");
String ascii_text = args[0];
tree.CreateLeafNodes(ascii_text);
tree.BuildTree();
System.out.println(ascii_text);
String huffman_text = tree.Encode(ascii_text);
System.out.println(huffman_text);
compression = huffman_text.length() * 100/ascii_text.length();
System.out.println(compression);
String ascii_text_2 = tree.Decode(huffman_text);
}
}
我将逐一检查错误。
Error line 96
cannot find symbol if (huffman_text.chartAt(i) == "1") ^ symbol: method chartAt(int)
打字错误:调用方法 charAt()
不是 chartAt()
Error lines 103, 104 and 107
cannot find symbol { ... } ^ symbol: variable i
您在 for 循环外使用了 i
:它未在此范围内声明
Error line 105
cannot find symbol else if (leaf_nodes[huffman_code] == null) ^ symbol: variable huffman_code
huffman_code
未在任何地方声明。
这些是错误,你应该可以解决。或者至少知道该怎么做,只要看着他们。理解错误消息是编程中需要的技能!
无论如何,您的代码还有一些问题实际上也应该抛出错误消息:
if (huffman_text.chartAt(i) == "1")
在此语句中,您将 huffman_text.chartAt(i)
与 "1"
进行比较。这应该是不可能的,因为方法 charAt()
returns a char
,但是 "1"
是类型 String
.
比较这个的正确方法是只使用单引号,它代表 char
:
if (huffman_text.chartAt(i) == '1')