用java写一个具有以下功能的代码: (1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和m个权值,建立哈夫曼树,并将它存于文件hfmTree中。 (2)E:编码(Encoding)。利用以建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 (4)V:打印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中
时间: 2023-02-06 21:54:20 浏览: 295
NPCSpawn:初始提交
下面是用 Java 实现上述功能的示例代码:
```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
public class HuffmanCoding {
// 哈夫曼树的节点类
static class Node implements Comparable<Node> {
char ch;
int freq;
Node left, right;
Node(char ch, int freq) {
this.ch = ch;
this.freq = freq;
}
Node(char ch, int freq, Node left, Node right) {
this(ch, freq);
this.left = left;
this.right = right;
}
@Override
public int compareTo(Node that) {
return this.freq - that.freq;
}
}
// 初始化:从终端读入字符集大小 n,以及 n 个字符和 m 个权值,建立哈夫曼树
public static Node init() throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
// 读入 n 个字符和 m 个权值
Map<Character, Integer> freq = new HashMap<>();
for (int i = 0; i < n; i++) {
String[] line = reader.readLine().split(" ");
char ch = line[0].charAt(0);
int w = Integer.parseInt(line[1]);
freq.put(ch, w);
}
// 建立哈夫曼树
PriorityQueue<Node> pq = new PriorityQueue<>();
for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
pq.add(new Node(entry.getKey(), entry.getValue()));
}
while (pq.size() > 1) {
Node left = pq.poll();
Node right = pq.poll();
Node parent = new Node('\0', left.freq + right.freq, left, right);
pq.add(parent);
}
Node root = pq.poll();
// 将哈夫曼树存入文件 hfmTree 中
BufferedWriter writer = new BufferedWriter(new FileWriter("hfmTree"));
writeTree(root, writer);
writer.close();
return root;
}
// 将哈
阅读全文