JAVA学习—Huffman 编码 (节点定义与文件读取)—2021-06-16
代码
package datastructure.tree;import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Collectors;/*** Huffman tree, encoding, and decoding. For simplicity, only ASCII characters* are supported.* * @author henyuzuo.*/
public class Huffman {
/*** An inner class for Huffman nodes.*/class HuffmanNode {
/*** The char. Only valid for leaf nodes.*/char character;/*** Weight. It can also be double.*/int weight;/*** The left child.*/HuffmanNode leftChild;/*** The right child.*/HuffmanNode rightChild;/*** The parent. It helps constructing the Huffman code of each character.*/HuffmanNode parent;/********************* * The first constructor******************* */public HuffmanNode(char paraCharacter, int paraWeight, HuffmanNode paraLeftChild,HuffmanNode paraRightChild, HuffmanNode paraParent) {
character = paraCharacter;weight = paraWeight;leftChild = paraLeftChild;rightChild = paraRightChild;parent = paraParent;}// Of HuffmanNode/********************* * To string.******************* */public String toString() {
String resultString = "(" + character + ", " + weight + ")";return resultString;}// Of toString}// Of class HuffmanNode/*** The number of characters. 256 for ASCII.*/public static final int NUM_CHARS = 256;/*** The input text. It is stored in a string for simplicity.*/String inputText;/*** The length of the alphabet, also the number of leaves.*/int alphabetLength;/*** The alphabet.*/char[] alphabet;/*** The count of chars. The length is 2 * alphabetLength - 1 to include* non-leaf nodes.*/int[] charCounts;/*** The mapping of chars to the indices in the alphabet.*/int[] charMapping;/*** Codes for each char in the alphabet. It should have the same length as* alphabet.*/String[] huffmanCodes;/*** All nodes. The last node is the root.*/HuffmanNode[] nodes;/************************ The first constructor.* * @param paraFilename* The text filename.**********************/public Huffman(String paraFilename) {
charMapping = new int[NUM_CHARS];readText(paraFilename);}// Of the first constructor/************************ Read text.* * @param paraFilename* The text filename.**********************/public void readText(String paraFilename) {
try {
inputText = Files.newBufferedReader(Paths.get(paraFilename), StandardCharsets.UTF_8).lines().collect(Collectors.joining("\n"));} catch (Exception ee) {
System.out.println(ee);System.exit(0);} // Of trySystem.out.println("The text is:\r\n" + inputText);}// Of readText