Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.util.stream.*;
- import java.io.*;
- public class Main {
- private HashMap<String, HuffmanElement> dict = new HashMap<>();
- private TreeMap<Integer, ArrayList<HuffmanElement>> map = new TreeMap<>();
- public static void main(String[] args) {
- String input = null;
- try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
- input = br.readLine();
- new Main().run(input);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public void run(String input) {
- Arrays.asList(input.split(""))
- .forEach(lit -> {
- if (dict.containsKey(lit)) {
- dict.get(lit).addFrequency();
- } else {
- dict.put(lit, new HuffmanElement(lit));
- }});
- /**
- * семен в следующих 6-ти строчках какая-то дичь творится
- * на вход приходит dict c размером N, и map с размером 0
- * ожидаю на выходе заполненый map с размером N
- * выходит гавно какое-то
- * **/
- dict.values()
- .forEach(x -> {
- ArrayList<HuffmanElement> list = new ArrayList<>();
- list.add(x);
- map.put(x.getFrequency(), list);
- System.out.println(map.size());
- });
- /**
- * ------------------------------------------------------
- * **/
- getCode();
- String answer = Arrays.asList(input.split(""))
- .stream()
- .map(lit -> dict.get(lit).getCode())
- .collect(Collectors.joining(""));
- System.out.println(dict.size() + " " + answer.length());
- dict.forEach((lit, huff) -> System.out.println(lit + ": " + huff.getCode()));
- System.out.println(answer);
- }
- public void getCode(){
- while (map.size() >= 2) {
- Map.Entry<Integer, ArrayList<HuffmanElement>> entry1 = map.firstEntry();
- int freq1 = entry1.getKey();
- ArrayList<HuffmanElement> list1 = entry1.getValue();
- list1.forEach(huff -> huff.addCode(0));
- map.remove(entry1.getKey());//что удаляет?
- Map.Entry<Integer, ArrayList<HuffmanElement>> entry2 = map.firstEntry();
- int freq2 = entry2.getKey();
- ArrayList<HuffmanElement> list2 = entry2.getValue();
- list2.forEach(huff -> huff.addCode(1));
- map.remove(entry1.getKey());//что удаляет?
- list1.addAll(list2);
- ArrayList<HuffmanElement> listSum = new ArrayList<>(list1);
- listSum.addAll(list2);
- int freqSum = freq1 + freq1;
- map.put(freqSum, listSum);
- }
- }
- public class HuffmanElement {
- private String lit;
- private String code = "";
- private int frequency = 1;
- public HuffmanElement(String lit) {
- this.lit = lit;
- }
- public void addFrequency() {
- this.frequency += 1;
- }
- public int getFrequency() {
- return frequency;
- }
- public String getLit() {
- return lit;
- }
- public String getCode() {
- return code;
- }
- public void addCode(int num) {
- this.code = code + num + "";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement