Advertisement
Guest User

Untitled

a guest
Apr 25th, 2018
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.36 KB | None | 0 0
  1. package huffman;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.BufferedWriter;
  5. import java.io.File;
  6. import java.io.FileNotFoundException;
  7. import java.io.FileReader;
  8. import java.io.FileWriter;
  9. import java.io.IOException;
  10. import java.util.ArrayList;
  11. import java.util.Collections;
  12. import java.util.Comparator;
  13. import java.util.HashMap;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import java.util.Map;
  17. import java.util.Map.Entry;
  18.  
  19. public class Main {
  20.     public static void main(String[] args) {
  21.         HuffmanEncoder he = new HuffmanEncoder("illiad.txt");
  22.         String encoded = he.getEncoded();
  23.         //String unencoded = he.unencode();
  24.        
  25.         //System.out.println(encoded);
  26.         //System.out.println(unencoded);
  27.        
  28.         try {
  29.             BufferedWriter bw = new BufferedWriter(new FileWriter(new File("output.txt")));
  30.             bw.append(encoded);
  31.             bw.close();
  32.         } catch (IOException e) {
  33.             // TODO Auto-generated catch block
  34.             e.printStackTrace();
  35.         }
  36.        
  37.         he.printTree();
  38.     }
  39. }
  40.  
  41. class HuffmanEncoder {
  42.     Node<Character> home;
  43.     HashMap<Character, String> dict;
  44.     HashMap<String, Character> un_dict;
  45.     String encoded;
  46.    
  47.     public HuffmanEncoder(String filename) {
  48.         String total_text = "";
  49.         HashMap<Character, Integer> char_table = new HashMap<Character, Integer>();
  50.         try {
  51.             BufferedReader br = new BufferedReader(new FileReader(new File(filename)));
  52.             int i = 0;
  53.             int count = 0;
  54.             while ((i = br.read()) != -1) {
  55.                 count++;
  56.                 char c = (char)i;
  57.                 if (!char_table.containsKey(c))
  58.                     char_table.put(c, 0);
  59.                 char_table.replace(c, char_table.get(c) + 1);
  60.                 total_text += Character.toString(c);
  61.                 if (count % 100000 == 0) {
  62.                     System.out.println(count);
  63.                 }
  64.             }
  65.         } catch (FileNotFoundException e) {
  66.             e.printStackTrace();
  67.         } catch (IOException e) {
  68.             e.printStackTrace();
  69.         }
  70.         getDict(char_table);
  71.         dict = home.getDict();
  72.         un_dict = new HashMap<String, Character>();
  73.         for (Entry<Character, String> e : dict.entrySet())
  74.             un_dict.put(e.getValue(), e.getKey());
  75.        
  76.         encoded = "";
  77.         for (char c : total_text.toCharArray())
  78.             encoded += dict.get(c);
  79.     }
  80.    
  81.     public String getEncoded() {
  82.         return this.encoded;
  83.     }
  84.    
  85.     public void printTree() {
  86.         home.printNode(0);
  87.     }
  88.  
  89.     public String unencode() {
  90.         String unencoded = "";
  91.         String curr = "";
  92.         for (char c : encoded.toCharArray()) {
  93.             curr += c;
  94.             if (un_dict.containsKey(curr)) {
  95.                 unencoded += un_dict.get(curr);
  96.                 curr = "";
  97.             }
  98.         }
  99.         return unencoded;
  100.     }
  101.    
  102.     public void getDict(HashMap<Character, Integer> char_table) {
  103.         List<Entry<Character, Integer>> freq_list = sortChars(char_table);     
  104.         List<Node<Character>> queue = new ArrayList<Node<Character>>();
  105.        
  106.         for(Entry<Character, Integer> e : freq_list)
  107.             queue.add(new Node<Character>(e.getKey(), e.getValue()));
  108.        
  109.         while (queue.size() > 1) {
  110.             Node<Character> b = queue.get(queue.size() - 1);
  111.             queue.remove(queue.size() - 1);
  112.             Node<Character> a = queue.get(queue.size() - 1);
  113.             queue.remove(queue.size() - 1);
  114.             Node<Character> new_node = new Node<Character>(a,b);
  115.             queue.add(new_node);
  116.             queue = sortQueue(queue);
  117.         }
  118.         home = queue.get(0);
  119.     }
  120.    
  121.     public List<Entry<Character, Integer>> sortChars(HashMap<Character, Integer> char_table){
  122.         Comparator<Entry<Character, Integer>> valueComparator = new Comparator<Entry<Character,Integer>>() {    
  123.             @Override
  124.             public int compare(Entry<Character, Integer> e1, Entry<Character, Integer> e2) {
  125.                 return -Integer.compare(e1.getValue(), e2.getValue());
  126.             }
  127.         };
  128.         List<Entry<Character, Integer>> listOfEntries = new ArrayList<Entry<Character, Integer>>(char_table.entrySet());
  129.         Collections.sort(listOfEntries, valueComparator);
  130.         return listOfEntries;
  131.     }
  132.    
  133.     public List<Node<Character>> sortQueue(List<Node<Character>> queue){
  134.         Comparator<Node<Character>> valueComparator = new Comparator<Node<Character>>() {    
  135.             @Override
  136.             public int compare(Node<Character> e1, Node<Character> e2) {
  137.                 return -Integer.compare(e1.weight, e2.weight);
  138.             }
  139.         };
  140.         Collections.sort(queue, valueComparator);
  141.         return queue;
  142.     }
  143. }
  144.  
  145. class Node<T> {
  146.     T value = null;
  147.     int weight;
  148.     Node<T> parent = null;
  149.     Node<T> a = null;
  150.     Node<T> b = null;
  151.     String encoding = "";
  152.    
  153.     public Node(T value, int weight) {
  154.         this.value = value;
  155.         this.weight = weight;
  156.     }
  157.    
  158.     public Node(Node<T> a, Node<T> b) {
  159.         this.a = a;
  160.         a.parent = this;
  161.         this.b = b;
  162.         b.parent = this;
  163.         this.weight = a.weight + b.weight;
  164.     }
  165.    
  166.     public String getEncoding(String e) {
  167.         String s = "";
  168.         if (parent != null) {
  169.             if (parent.a == this)
  170.                 s += "1";
  171.             else
  172.                 s += "0";
  173.             s = this.parent.getEncoding(e) + s;
  174.         }
  175.         return s;
  176.     }
  177.    
  178.     public HashMap<T, String> getDict() {
  179.         HashMap<T, String> dict = new HashMap<T, String>();
  180.         if (value != null) {
  181.             dict.put(value, this.getEncoding(""));
  182.         }else {
  183.             dict.putAll(a.getDict());
  184.             dict.putAll(b.getDict());
  185.         }
  186.         return dict;
  187.     }
  188.    
  189.     //testing
  190.     public void printNode(int t) {
  191.         for (int i = 0; i < t; i++)
  192.             System.out.print("\t");
  193.         System.out.print("(E=" + this.getEncoding(""));
  194.         if (this.value == null)
  195.             System.out.print(", W="+ this.weight +")\n");
  196.         else
  197.             System.out.print(", V="+this.weight+")\n");        
  198.         if (this.a != null)
  199.             a.printNode(t + 1);
  200.         if (this.b != null)
  201.             b.printNode(t + 1);
  202.     }
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement