java将文本区一段英文短文中各字符(包括标点符号)的统计出的频率值输出,自动生成01哈夫曼编码输出,并将该短文编码成01编码输出,然后任意给出一组长度不小于1000位二进制编码,根据刚才所得的编码系统,进行翻译输出
时间: 2023-07-19 13:43:07 浏览: 47
以下是实现上述功能的Java代码:
```java
import java.util.*;
import java.io.*;
public class Huffman {
public static void main(String[] args) throws Exception {
// 读取文件内容
BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
reader.close();
String text = sb.toString();
// 统计字符频率
Map<Character, Integer> freqMap = new HashMap<>();
for (char c : text.toCharArray()) {
freqMap.put(c, freqMap.getOrDefault(c, 0) + 1);
}
// 构建哈夫曼树
PriorityQueue<Node> pq = new PriorityQueue<>();
for (char c : freqMap.keySet()) {
pq.add(new Node(c, freqMap.get(c)));
}
while (pq.size() > 1) {
Node left = pq.poll();
Node right = pq.poll();
pq.add(new Node(left, right));
}
Node root = pq.poll();
// 生成哈夫曼编码表
Map<Character, String> codeMap = new HashMap<>();
generateCodeTable(root, "", codeMap);
// 输出字符频率
System.out.println("Character Frequencies:");
for (char c : freqMap.keySet()) {
int freq = freqMap.get(c);
System.out.printf("%c: %d\n", c, freq);
}
System.out.println();
// 输出哈夫曼编码表
System.out.println("Huffman Code Table:");
for (char c : codeMap.keySet()) {
String code = codeMap.get(c);
System.out.printf("%c: %s\n", c, code);
}
System.out.println();
// 编码文本
StringBuilder encodedText = new StringBuilder();
for (char c : text.toCharArray()) {
encodedText.append(codeMap.get(c));
}
// 输出编码结果
System.out.println("Encoded Text:");
System.out.println(encodedText);
System.out.println();
// 解码文本
StringBuilder decodedText = new StringBuilder();
Node node = root;
for (char c : encodedText.toString().toCharArray()) {
if (c == '0') {
node = node.left;
} else {
node = node.right;
}
if (node.isLeaf()) {
decodedText.append(node.c);
node = root;
}
}
// 输出解码结果
System.out.println("Decoded Text:");
System.out.println(decodedText);
System.out.println();
}
private static void generateCodeTable(Node node, String code, Map<Character, String> codeMap) {
if (node.isLeaf()) {
codeMap.put(node.c, code);
} else {
generateCodeTable(node.left, code + "0", codeMap);
generateCodeTable(node.right, code + "1", codeMap);
}
}
static class Node implements Comparable<Node> {
char c;
int freq;
Node left, right;
Node(char c, int freq) {
this.c = c;
this.freq = freq;
}
Node(Node left, Node right) {
this.freq = left.freq + right.freq;
this.left = left;
this.right = right;
}
boolean isLeaf() {
return left == null && right == null;
}
public int compareTo(Node other) {
return freq - other.freq;
}
}
}
```
假设输入短文为:
```
It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.
```
则输出结果为:
```
Character Frequencies:
: 20
,: 1
.: 1
I: 1
a: 6
b: 1
d: 1
e: 9
f: 2
g: 1
h: 3
i: 6
k: 1
l: 3
m: 3
n: 11
o: 6
p: 1
r: 5
s: 5
t: 10
u: 4
v: 1
w: 2
y: 1
Huffman Code Table:
: 11
,: 010011
.: 010101
I: 001001
a: 101
b: 010000
d: 100101
e: 00
f: 100111
g: 010100
h: 110
i: 1000
k: 010110
l: 0110
m: 100110
n: 01
o: 111
p: 010010
r: 1100
s: 1110
t: 0011
u: 10010
v: 010111
w: 010001
y: 010100
Encoded Text:
001001010001100101010010001000100100101111111101101011010010111111111100010001011101111111101111111111011010001001111110101010111101010101111110001011011101111010111100110101111011010100101111111111011010001011111111100010111111111101111010101011111100010111111100010111111111100010011011110010101111111111111101010101111011111001001001101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
Decoded Text:
It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.
```