1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.Map; 4 import java.util.Scanner; 5 6 7 class Node{ 8 char letter; 9 int power; 10 Node left_son; 11 Node right_son; 12 public Node() { super();} 13 public Node(int power) { 14 this.power = power; 15 } 16 } 17 public class CurrDesign { 18 19 static Map<Character, String> map = new HashMap<Character, String>(); 20 public static void main(String[] args) { 21 List <Node>list = codingTable();//输入 22 Node tree_root = creatHFMtree(list); 23 creatTable(tree_root,""); 24 display(); 25 26 String text = inputText(); 27 encode(text); 28 29 String code = inputCode(); 30 decode(code,tree_root); 31 } 32 33 public static String[] encode(String text) { 34 String []s = new String[100]; 35 char []key = text.toCharArray(); 36 System.out.println("编码结果为:"); 37 for(int i=0;i<key.length;i++) { 38 s[i]=map.get(key[i]); 39 System.out.print(s[i]+" "); 40 } 41 System.out.println(); 42 return s; 43 } 44 45 public static void decode(String s,Node tree_root) { 46 System.out.println("译码结果为:"); 47 char []num = s.toCharArray(); 48 Node node = tree_root; 49 for(int i=0;i<num.length;i++) { 50 node = check(node,num[i]); 51 if(node==null) { 52 node = check(tree_root,num[i]); 53 } 54 } 55 System.out.println(node.letter); 56 } 57 58 public static Node check(Node node,char c) { 59 if(node.left_son!=null && c=='0') 60 return node.left_son; 61 else if(node.right_son!=null && c=='1'){ 62 return node.right_son; 63 } 64 System.out.print(node.letter); 65 return null; 66 } 67 68 public static Object getKey(Object value){ 69 for(Object key: map.keySet()){ 70 if(map.get(key).equals(value)){ 71 return key; 72 } 73 } 74 return null; 75 } 76 77 public static String inputText() { 78 Scanner in = new Scanner(System.in); 79 System.out.println("请输入要编码的文本,只含大写字母:"); 80 String text = in.next(); 81 return text; 82 } 83 84 public static String inputCode() { 85 Scanner in = new Scanner(System.in); 86 System.out.println("请输入编码:"); 87 String code = in.next(); 88 in.close(); 89 return code; 90 } 91 92 public static List<Node> codingTable(){ 93 List <Node>list = new ArrayList<Node>(); 94 int []num = {186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16}; 95 Node node = null; 96 for(int n=0;n<26;n++) { 97 node = new Node(); 98 node.letter = (char)('A'+n); 99 node.power = num[n]; 100 list.add(node); 101 } 102 return list; 103 } 104 105 public static void display() { 106 System.out.println("The huffman coding table are:"); 107 System.out.println(map.toString()); 108 } 109 110 public static Node creatHFMtree(List<Node> list){ 111 Node p = null; 112 int n = 0; 113 while(!list.isEmpty()) { 114 if(n!=0) { 115 list.add(p); 116 } 117 Node min1 = new Node(1000); 118 Node min2 = new Node(999); 119 for(Node node:list) { 120 if(node.power < min1.power) { 121 if(node.power < min2.power) { 122 min1 = min2; 123 min2 = node; 124 }else { 125 min1 = node; 126 } 127 } 128 } 129 p = new Node(min1.power+min2.power); 130 p.left_son = min2; 131 p.right_son = min1; 132 list.remove(min1); 133 list.remove(min2); 134 n++; 135 } 136 return p; 137 } 138 139 public static void creatTable(Node node,String coding){ 140 if(node.left_son!=null) { 141 creatTable(node.left_son,coding+"0"); 142 } 143 if(node.right_son!=null) { 144 creatTable(node.right_son,coding+"1"); 145 } 146 if(node.left_son==null && node.right_son==null) { 147 map.put(node.letter, coding); 148 } 149 } 150 }