Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.32 KB | None | 0 0
  1. package huffman.algorithm;
  2. import javafx.util.Pair;
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.io.*;
  6. import java.util.*;
  7.  
  8. public class Huffman {
  9.     String text = "";
  10.     ArrayList<Pair<String, Integer>> nodeList;
  11.     TreeMap<Character, String> prefixCodes;
  12.     public static void main(String[] args){
  13.         Huffman h = new Huffman();
  14.         h.loadFile();
  15.         h.codingAndDecoding();
  16.     }
  17.     public void loadFile(){
  18.         JFileChooser chooser = new JFileChooser();
  19.         chooser.showOpenDialog(null);
  20.         readFile(chooser.getSelectedFile());
  21.     }
  22.     public void readFile(File file){
  23.         try(BufferedReader in = new BufferedReader(new FileReader(file))){
  24.             TreeMap<Character, Integer> freqTable = new TreeMap<>();
  25.             String line = null;
  26.             while((line = in.readLine()) != null){
  27.                 text += line;
  28.                 for(int i = 0; i < line.length(); i++)
  29.                     freqTable.put(line.charAt(i),
  30.                             freqTable.containsKey(line.charAt(i)) ? freqTable.get(line.charAt(i)) + 1 : 1 );
  31.             }
  32.             nodeList = new ArrayList<>();
  33.             for(Map.Entry e : freqTable.entrySet())
  34.                 nodeList.add(new Pair(e.getKey().toString(), e.getValue()));
  35.             Collections.sort(nodeList, new comparatorList());
  36.             makePrefixCodes(nodeList);
  37.         }catch(IOException ex){
  38.             ex.printStackTrace();
  39.         }
  40.     }
  41.     public void makePrefixCodes(ArrayList<Pair<String, Integer>> list){
  42.         prefixCodes = new TreeMap<>();
  43.         for(Pair<String, Integer> p : list) {
  44.             Character c = p.getKey().charAt(0);
  45.             prefixCodes.put(c, "");
  46.         }
  47.         System.out.println(list);
  48.         while(list.size() > 1){
  49.             String leftSon = list.get(list.size() - 2).getKey();
  50.             String rightSon = list.get(list.size() - 1).getKey();
  51.  
  52.             Pair<String, Integer> temp;
  53.             temp = new Pair<>(leftSon + rightSon, list.get(list.size() - 2).getValue() + list.get(list.size() - 1).getValue());
  54.  
  55.             for(int i = 0; i < leftSon.length(); i++)
  56.                 prefixCodes.put(leftSon.charAt(i), prefixCodes.get(leftSon.charAt(i)) + "0");
  57.             for(int i = 0; i < rightSon.length(); i++)
  58.                 prefixCodes.put(rightSon.charAt(i), prefixCodes.get(rightSon.charAt(i)) + "1");
  59.  
  60.             list.remove(list.size() - 1);
  61.             list.remove(list.size() - 1);
  62.             list.add(temp);
  63.             Collections.sort(list, new comparatorList());
  64.             System.out.println(list);
  65.         }
  66. //        System.out.println(prefixCodes);
  67.         for(Map.Entry e : prefixCodes.entrySet()){
  68.             StringBuilder newCode = new StringBuilder(e.getValue().toString());
  69.             prefixCodes.put((Character)e.getKey(), newCode.reverse().toString());
  70.         }
  71.         System.out.println(prefixCodes);
  72.     }
  73.  
  74.     class comparatorList implements Comparator<Pair<String, Integer>>{
  75.         @Override
  76.         public int compare(Pair<String, Integer> one, Pair<String, Integer> two) {
  77.             return one.getValue() > two.getValue() ? -1 : one.getValue() < two.getValue() ? 1 : 0;
  78.         }
  79.     }
  80.  
  81.     public void codingAndDecoding(){
  82.         JFileChooser chooser = new JFileChooser();
  83.         chooser.showOpenDialog(null);
  84.         write(chooser.getSelectedFile());
  85.         JFileChooser chooser1 = new JFileChooser();
  86.         chooser1.showOpenDialog(null);
  87.         read(chooser1.getSelectedFile());
  88.     }
  89.     public void write(File file) {
  90.         try(FileOutputStream writer = new FileOutputStream(file)) {
  91.             Character temp = null;
  92.             // по строчкам текста
  93.             // по буквам строки
  94.             for (int i = 0; i < text.length(); i++) {
  95.                 temp = text.charAt(i);
  96.                 int lengthCode = prefixCodes.get(temp).length();
  97.                 byte buffer = 0;
  98.                 //по коду буквы
  99.                 for (int j = 0; j < lengthCode; j++) {
  100.                     if (prefixCodes.get(temp).charAt(j) == '0')
  101.                         buffer |= (0 << j);
  102.                     else
  103.                         buffer |= (1 << j);
  104.                 }
  105.                 writer.write(buffer);
  106.             }
  107.         } catch (IOException ex) {
  108.             ex.printStackTrace();
  109.         }
  110.     }
  111.     public void read(File file){
  112.         TreeMap<String, Character> decodeMap = new TreeMap<>();
  113.         for(Map.Entry e : prefixCodes.entrySet())
  114.             decodeMap.put(e.getValue().toString(), (Character)e.getKey());
  115.  
  116.         try(FileInputStream input = new FileInputStream(file)) {
  117.             byte b = -1;
  118.             byte[] mass = input.readAllBytes();
  119.             for(int k = 0; k < mass.length; k++){
  120.                 b = mass[k];
  121.                 String code = "";
  122.                 for (int i = 0; i < 8; i++) {
  123.                     if ((b & (1 << i)) != 0)
  124.                         code += "1";
  125.                     else
  126.                         code += "0";
  127.                     if(decodeMap.containsKey(code)){
  128.                         System.out.print((decodeMap.get(code) + ""));
  129.                         break;
  130.                     }
  131.                 }
  132.             }
  133.         }catch(IOException ex){
  134.             ex.printStackTrace();
  135.         }
  136.     }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement