Advertisement
Guest User

huffmanelement

a guest
Oct 25th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 3.56 KB | None | 0 0
  1. import java.util.*;
  2. import java.util.stream.*;
  3. import java.io.*;
  4.  
  5. public class Main {
  6.    
  7.     private HashMap<String, HuffmanElement> dict = new HashMap<>();
  8.     private TreeMap<Integer, ArrayList<HuffmanElement>> map = new TreeMap<>();
  9.    
  10.     public static void main(String[] args) {
  11.         String input = null;
  12.         try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
  13.             input = br.readLine();
  14.             new Main().run(input);
  15.         } catch (IOException e) {
  16.             e.printStackTrace();
  17.         }
  18.     }
  19.    
  20.     public void run(String input) {
  21.         Arrays.asList(input.split(""))
  22.             .forEach(lit -> {
  23.                 if (dict.containsKey(lit)) {
  24.                     dict.get(lit).addFrequency();
  25.                 } else {
  26.                     dict.put(lit, new HuffmanElement(lit));
  27.             }});
  28. /**
  29.  * семен в следующих 6-ти строчках какая-то дичь творится
  30.  * на вход приходит dict c размером N, и map с размером 0
  31.  * ожидаю на выходе заполненый map с размером N
  32.  * выходит гавно какое-то
  33.  * **/
  34.         dict.values()
  35.             .forEach(x -> {
  36.                 ArrayList<HuffmanElement> list = new ArrayList<>();
  37.                 list.add(x);
  38.                 map.put(x.getFrequency(), list);
  39.                 System.out.println(map.size());
  40.             });
  41. /**
  42.  * ------------------------------------------------------
  43.  * **/
  44.         getCode();
  45.         String answer = Arrays.asList(input.split(""))
  46.             .stream()
  47.             .map(lit -> dict.get(lit).getCode())
  48.             .collect(Collectors.joining(""));
  49.         System.out.println(dict.size() + " " + answer.length());
  50.         dict.forEach((lit, huff) -> System.out.println(lit + ": " + huff.getCode()));
  51.         System.out.println(answer);
  52.     }
  53.    
  54.     public void getCode(){
  55.         while (map.size() >= 2) {
  56.            
  57.             Map.Entry<Integer, ArrayList<HuffmanElement>> entry1 = map.firstEntry();
  58.             int freq1 = entry1.getKey();
  59.             ArrayList<HuffmanElement> list1 = entry1.getValue();
  60.             list1.forEach(huff -> huff.addCode(0));
  61.             map.remove(entry1.getKey());//что удаляет?
  62.            
  63.             Map.Entry<Integer, ArrayList<HuffmanElement>> entry2 = map.firstEntry();
  64.             int freq2 = entry2.getKey();
  65.             ArrayList<HuffmanElement> list2 = entry2.getValue();
  66.             list2.forEach(huff -> huff.addCode(1));
  67.             map.remove(entry1.getKey());//что удаляет?
  68.            
  69.             list1.addAll(list2);
  70.             ArrayList<HuffmanElement> listSum = new ArrayList<>(list1);
  71.             listSum.addAll(list2);
  72.             int freqSum = freq1 + freq1;
  73.             map.put(freqSum, listSum);
  74.            
  75.         }
  76.     }
  77.    
  78.     public class HuffmanElement {
  79.         private String lit;
  80.         private String code = "";
  81.         private int frequency = 1;
  82.        
  83.         public HuffmanElement(String lit) {
  84.             this.lit = lit;
  85.         }
  86.        
  87.         public void addFrequency() {
  88.             this.frequency += 1;
  89.         }
  90.        
  91.         public int getFrequency() {
  92.             return frequency;
  93.         }
  94.        
  95.         public String getLit() {
  96.             return lit;
  97.         }
  98.        
  99.         public String getCode() {
  100.             return code;
  101.         }
  102.        
  103.         public void addCode(int num) {
  104.             this.code = code + num + "";
  105.         }
  106.     }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement