Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package huffman.algorithm;
- import javafx.util.Pair;
- import javax.swing.*;
- import java.awt.*;
- import java.io.*;
- import java.util.*;
- public class Huffman {
- String text = "";
- ArrayList<Pair<String, Integer>> nodeList;
- TreeMap<Character, String> prefixCodes;
- public static void main(String[] args){
- Huffman h = new Huffman();
- h.loadFile();
- h.codingAndDecoding();
- }
- public void loadFile(){
- JFileChooser chooser = new JFileChooser();
- chooser.showOpenDialog(null);
- readFile(chooser.getSelectedFile());
- }
- public void readFile(File file){
- try(BufferedReader in = new BufferedReader(new FileReader(file))){
- TreeMap<Character, Integer> freqTable = new TreeMap<>();
- String line = null;
- while((line = in.readLine()) != null){
- text += line;
- for(int i = 0; i < line.length(); i++)
- freqTable.put(line.charAt(i),
- freqTable.containsKey(line.charAt(i)) ? freqTable.get(line.charAt(i)) + 1 : 1 );
- }
- nodeList = new ArrayList<>();
- for(Map.Entry e : freqTable.entrySet())
- nodeList.add(new Pair(e.getKey().toString(), e.getValue()));
- Collections.sort(nodeList, new comparatorList());
- makePrefixCodes(nodeList);
- }catch(IOException ex){
- ex.printStackTrace();
- }
- }
- public void makePrefixCodes(ArrayList<Pair<String, Integer>> list){
- prefixCodes = new TreeMap<>();
- for(Pair<String, Integer> p : list) {
- Character c = p.getKey().charAt(0);
- prefixCodes.put(c, "");
- }
- System.out.println(list);
- while(list.size() > 1){
- String leftSon = list.get(list.size() - 2).getKey();
- String rightSon = list.get(list.size() - 1).getKey();
- Pair<String, Integer> temp;
- temp = new Pair<>(leftSon + rightSon, list.get(list.size() - 2).getValue() + list.get(list.size() - 1).getValue());
- for(int i = 0; i < leftSon.length(); i++)
- prefixCodes.put(leftSon.charAt(i), prefixCodes.get(leftSon.charAt(i)) + "0");
- for(int i = 0; i < rightSon.length(); i++)
- prefixCodes.put(rightSon.charAt(i), prefixCodes.get(rightSon.charAt(i)) + "1");
- list.remove(list.size() - 1);
- list.remove(list.size() - 1);
- list.add(temp);
- Collections.sort(list, new comparatorList());
- System.out.println(list);
- }
- // System.out.println(prefixCodes);
- for(Map.Entry e : prefixCodes.entrySet()){
- StringBuilder newCode = new StringBuilder(e.getValue().toString());
- prefixCodes.put((Character)e.getKey(), newCode.reverse().toString());
- }
- System.out.println(prefixCodes);
- }
- class comparatorList implements Comparator<Pair<String, Integer>>{
- @Override
- public int compare(Pair<String, Integer> one, Pair<String, Integer> two) {
- return one.getValue() > two.getValue() ? -1 : one.getValue() < two.getValue() ? 1 : 0;
- }
- }
- public void codingAndDecoding(){
- JFileChooser chooser = new JFileChooser();
- chooser.showOpenDialog(null);
- write(chooser.getSelectedFile());
- JFileChooser chooser1 = new JFileChooser();
- chooser1.showOpenDialog(null);
- read(chooser1.getSelectedFile());
- }
- public void write(File file) {
- try(FileOutputStream writer = new FileOutputStream(file)) {
- Character temp = null;
- // по строчкам текста
- // по буквам строки
- for (int i = 0; i < text.length(); i++) {
- temp = text.charAt(i);
- int lengthCode = prefixCodes.get(temp).length();
- byte buffer = 0;
- //по коду буквы
- for (int j = 0; j < lengthCode; j++) {
- if (prefixCodes.get(temp).charAt(j) == '0')
- buffer |= (0 << j);
- else
- buffer |= (1 << j);
- }
- writer.write(buffer);
- }
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- }
- public void read(File file){
- TreeMap<String, Character> decodeMap = new TreeMap<>();
- for(Map.Entry e : prefixCodes.entrySet())
- decodeMap.put(e.getValue().toString(), (Character)e.getKey());
- try(FileInputStream input = new FileInputStream(file)) {
- byte b = -1;
- byte[] mass = input.readAllBytes();
- for(int k = 0; k < mass.length; k++){
- b = mass[k];
- String code = "";
- for (int i = 0; i < 8; i++) {
- if ((b & (1 << i)) != 0)
- code += "1";
- else
- code += "0";
- if(decodeMap.containsKey(code)){
- System.out.print((decodeMap.get(code) + ""));
- break;
- }
- }
- }
- }catch(IOException ex){
- ex.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement