用Java实现哈夫曼编码译码系统

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

class H{
    public static void main(String[] args) {
        //创建主窗口
        JFrame jf = new JFrame("哈夫曼编码译码系统");

        //设置一个容器
        JPanel jp = new JPanel();
        jp.setLayout(null);
        //创建按钮
        JButton jb1 = new JButton("字符");
        JButton jb2 = new JButton("文章");
        JButton jb3 = new JButton("翻译");
        //设置按钮并放入容器中
        jp.add(jb1);
        jb1.setBounds(80,100,200,30);
        jb1.setBackground(new Color(0x55FFA7));
        Font f = new Font("楷体_GB2312 Regular",Font.BOLD,20);
        jb1.setFont(f);
        jb1.setForeground(new Color(0xFF0000));
        jb1.setFocusPainted(false);

        //添加生成字符编码的鼠标点击事件
        jb1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if(e.getButton() == MouseEvent.BUTTON1)
                {
                    Character_encoding();
                }
            }
            //字符编码窗口
            private void Character_encoding() {
                JFrame jf = new JFrame("字符编码");
                JPanel jp = new JPanel();
                jp.setLayout(null);
                //设置按钮
                JButton jb1 = new JButton("开始");
                jp.add(jb1);
                jb1.setBounds(100,10,200,30);
                jb1.setBackground(new Color(0xff5599));
                Font f = new Font("宋体_GB2312 Regular",Font.BOLD,20);
                jb1.setFont(f);
                jb1.setFocusPainted(false);


                JButton jb2 = new JButton("开始");
                jp.add(jb2);
                jb2.setBounds(130,250,100,30);
                jb2.setBackground(new Color(0xff5599));
                jb2.setFont(f);
                jb2.setFocusPainted(false);

                JButton jb3 = new JButton("保存");
                jp.add(jb3);
                jb3.setBounds(100,510,200,30);
                jb3.setFont(f);
                jb3.setFocusPainted(false);
                //设置文本框
                JTextArea jta1 = new JTextArea();
                jta1.setLineWrap(true);
                JScrollPane jsp1 = new JScrollPane(jta1);
                jp.add(jsp1);
                jsp1.setBounds(50,80,300,150);

                JTextArea jta2 = new JTextArea();
                jta1.setLineWrap(true);
                JScrollPane jsp2 = new JScrollPane(jta2);
                jp.add(jsp2);
                jsp2.setBounds(50,300,300,200);
                //导入文章
                jb1.addActionListener(e -> {
                    JFileChooser fileChooser = new JFileChooser();
                    int result = fileChooser.showOpenDialog(jf);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        File selectedFile = fileChooser.getSelectedFile();
                        try {
                            BufferedReader br = new BufferedReader(new FileReader(selectedFile));
                            String line;
                            while ((line = br.readLine()) != null) {
                                jta1.append(line + "\n");
                            }
                            br.close();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });
                //文章编译
                jb2.addActionListener(e -> {
                    String str = jta1.getText(); // 获取jsp1中的文本内容
                    Map<Character, Integer> frequencyMap = calculateFrequencies(str);
                    TreeNode root = buildHuffmanTree(frequencyMap);
                    Map<Character, String> huffmanCodes = generateHuffmanCodes(root);
                    printHuffmanCodes(huffmanCodes,jta2);
                });
                //保存字符编码
                jb3.addActionListener(e -> {
                    try {
                        String content = jta2.getText();
                        FileWriter writer = new FileWriter("C:\\Users\\a1022\\Desktop\\字符.txt");
                        writer.write(content);
                        writer.close();
                        JOptionPane.showMessageDialog(jf, "保存成功");
                    } catch (IOException ex) {
                        ex.printStackTrace();
                        JOptionPane.showMessageDialog(jf, "出错");
                    }
                });

                //把容器添加进窗口
                jf.add(jp);
                jf.setBounds(500, 300, 800, 800);
                jf.setVisible(true);
                jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                jf.setLocationRelativeTo(null);
            }
        });

        jp.add(jb2);
        jb2.setBounds(80,150+80,200,30);
        jb2.setBackground(new Color(0xFF9999));
        jb2.setFont(f);
        jb2.setForeground(new Color(0xFF0000));
        jb2.setFocusPainted(false);
        jb2.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if(e.getButton() == MouseEvent.BUTTON1)
                {
                    Article_coding();
                }
            }

            private void Article_coding() {
                JFrame jf = new JFrame("文章编码");
                JPanel jp = new JPanel();
                jp.setLayout(null);
                JButton jb1 = new JButton("打开文章");
                jp.add(jb1);
                jb1.setBounds(100,10,200,25);
                Font f = new Font("楷体_GB2312 Regular",Font.BOLD,20);
                jb1.setFont(f);
                jb1.setFocusPainted(false);

                JButton jb2 = new JButton("文章编码");
                jp.add(jb2);
                jb2.setBounds(300,300,200,25);
                jb2.setFont(f);
                jb2.setFocusPainted(false);

                JButton jb3 = new JButton("保存");
                jp.add(jb3);
                jb3.setBounds(300,530,200,25);
                jb3.setFont(f);
                jb3.setFocusPainted(false);

                JButton jb4 = new JButton("打开字符编码");
                jp.add(jb4);
                jb4.setBounds(500,10,200,25);
                jb4.setFont(f);
                jb4.setFocusPainted(false);

                //设置文本框
                JTextArea jta1 = new JTextArea();
                jta1.setLineWrap(true);
                JScrollPane jsp1 = new JScrollPane(jta1);
                jp.add(jsp1);
                jsp1.setBounds(50,80,300,150);

                JTextArea jta2 = new JTextArea();
                jta2.setLineWrap(true);
                JScrollPane jsp2 = new JScrollPane(jta2);
                jp.add(jsp2);
                jsp2.setBounds(450,80,300,150);

                JTextArea jta3 = new JTextArea();
                jta3.setLineWrap(true);
                JScrollPane jsp3 = new JScrollPane(jta3);
                jp.add(jsp3);
                jsp3.setBounds(50,360,700,150);
                //导入文章
                jb1.addActionListener(e -> {
                    JFileChooser fileChooser = new JFileChooser();
                    int result = fileChooser.showOpenDialog(jf);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        File selectedFile = fileChooser.getSelectedFile();
                        try {
                            BufferedReader br = new BufferedReader(new FileReader(selectedFile));
                            String line;
                            while ((line = br.readLine()) != null) {
                                jta1.append(line + "\n");
                            }
                            br.close();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });
                //导入字符编码
                jb4.addActionListener(e -> {
                    JFileChooser fileChooser = new JFileChooser();
                    int result = fileChooser.showOpenDialog(jf);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        File selectedFile = fileChooser.getSelectedFile();
                        try {
                            BufferedReader br = new BufferedReader(new FileReader(selectedFile));
                            String line;
                            while ((line = br.readLine()) != null) {
                                jta2.append(line + "\n");
                            }
                            br.close();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });
                //文章编译
                jb2.addActionListener(e -> {
                    String content = jta1.getText(); // 获取jsp1中的文本内容
                    String encoding = jta2.getText(); // 获取jsp2中的文本内容
                    //将字符编码存入哈希表中
                    Map<Character, String> huffmanMap = new HashMap<>();
                    String[] lines = encoding.split("\n");
                    for (String line : lines) {
//                        System.out.println(line);
                        String[] parts = line.split(":");
                        char character = parts[0].charAt(0);
                        String code = parts[1];
                        System.out.println(parts[0]+" "+parts[1]);
                        huffmanMap.put(character, code);
                    }
                    //进行编译
                    StringBuilder encodeString = new StringBuilder();
                    for(char c: content.toCharArray())
                    {
                        if(c != '\n')
                            encodeString.append(huffmanMap.get(c));
                    }
                    jta3.setText(encodeString.toString());
                });
                //保存文章编码
                jb3.addActionListener(e -> {
                    try {
                        String content = jta3.getText();
                        FileWriter writer = new FileWriter("C:\\Users\\a1022\\Desktop\\文章.txt");
                        writer.write(content);
                        writer.close();
                        JOptionPane.showMessageDialog(jf, "成功");
                    } catch (IOException ex) {
                        ex.printStackTrace();
                        JOptionPane.showMessageDialog(jf, "出错");
                    }
                });
                //把容器添加进窗口
                jf.add(jp);
                jf.setBounds(400, 300, 800, 600);
                jf.setVisible(true);
                jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                jf.setLocationRelativeTo(null);
            }
        });

        jp.add(jb3);
        jb3.setBounds(80,200+80+80,200,30);
        jb3.setBackground(new Color(0xFF000));
        jb3.setFont(f);
        jb3.setForeground(new Color(0xFF));
        jb3.setFocusPainted(false);
        jb3.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if(e.getButton() == MouseEvent.BUTTON1)
                {
                    decoding();
                }
            }

            private void decoding() {
                JFrame jf = new JFrame("文本翻译");
                JPanel jp = new JPanel();
                jp.setLayout(null);
                JButton jb1 = new JButton("打开文章编码");
                jp.add(jb1);
                jb1.setBounds(100,10,200,25);
                Font f = new Font("楷体_GB2312 Regular",Font.BOLD,20);
                jb1.setFont(f);
                jb1.setFocusPainted(false);

                JButton jb2 = new JButton("翻译");
                jp.add(jb2);
                jb2.setBounds(300,300,200,25);
                jb2.setBackground(new Color(0xff5599));
                jb2.setFont(f);
                jb2.setFocusPainted(false);

                JButton jb3 = new JButton("保存");
                jp.add(jb3);
                jb3.setBounds(300,530,200,25);
                jb3.setFont(f);
                jb3.setFocusPainted(false);

                JButton jb4 = new JButton("打开字符编码");
                jp.add(jb4);
                jb4.setBounds(500,10,200,25);
                jb4.setFont(f);
                jb4.setFocusPainted(false);

                //设置文本框
                JTextArea jta1 = new JTextArea();
                jta1.setLineWrap(true);
                JScrollPane jsp1 = new JScrollPane(jta1);
                jp.add(jsp1);
                jsp1.setBounds(50,80,300,150);

                JTextArea jta2 = new JTextArea();
                jta2.setLineWrap(true);
                JScrollPane jsp2 = new JScrollPane(jta2);
                jp.add(jsp2);
                jsp2.setBounds(450,80,300,150);

                JTextArea jta3 = new JTextArea();
                jta3.setLineWrap(true);
                JScrollPane jsp3 = new JScrollPane(jta3);
                jp.add(jsp3);
                jsp3.setBounds(50,360,700,150);
                //导入文章编码
                jb1.addActionListener(e -> {
                    JFileChooser fileChooser = new JFileChooser();
                    int result = fileChooser.showOpenDialog(jf);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        File selectedFile = fileChooser.getSelectedFile();
                        try {
                            BufferedReader br = new BufferedReader(new FileReader(selectedFile));
                            String line;
                            while ((line = br.readLine()) != null) {
                                jta1.append(line + "\n");
                            }
                            br.close();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });
                //导入字符编码
                jb4.addActionListener(e -> {
                    JFileChooser fileChooser = new JFileChooser();
                    int result = fileChooser.showOpenDialog(jf);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        File selectedFile = fileChooser.getSelectedFile();
                        try {
                            BufferedReader br = new BufferedReader(new FileReader(selectedFile));
                            String line;
                            while ((line = br.readLine()) != null) {
                                jta2.append(line + "\n");
                            }
                            br.close();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                });
                //文章编译
                jb2.addActionListener(e -> {
                    String content = jta1.getText(); // 获取jsp1中的文本内容
                    String encoding = jta2.getText(); // 获取jsp1中的文本内容
                    Map<String, Character> huffmanMap = new HashMap<>();
                    String[] lines = encoding.split("\n");

                    for (String line : lines) {
                        String[] parts = line.split(":");
                        Character character = parts[0].charAt(0);
                        String key = parts[1];
                        huffmanMap.put(key, character);
                    }

                    StringBuilder encodeString = new StringBuilder();
                    int L = 0,R = 1;
                    while(R <= content.length()) {
                        String part = content.substring(L,R);
                        if(huffmanMap.containsKey(part)) {
                            encodeString.append(huffmanMap.get(part));
                            L = R;
                        }
                        R++;
                    }
                    jta3.setText(encodeString.toString()); // 将文本内容设置到jsp2中

                });
                //保存文章
                jb3.addActionListener(e -> {
                    try {
                        String content = jta2.getText();
                        FileWriter writer = new FileWriter("F:\\MyData\\Desktop\\decoding.txt");
                        writer.write(content);
                        writer.close();
                        JOptionPane.showMessageDialog(jf, "成功");
                    } catch (IOException ex) {
                        ex.printStackTrace();
                        JOptionPane.showMessageDialog(jf, "出错");
                    }
                });
                //把容器添加进窗口
                jf.add(jp);
                jf.setBounds(400, 300, 800, 600);
                jf.setVisible(true);
                jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                jf.setLocationRelativeTo(null);
            }
        });

        //把容器添加进主窗口,窗口大小
        jf.add(jp);
        jf.setBounds(400, 300, 400, 600);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);


    }
    private static Map<Character, String> parseMappingString(String S) {
        Map<Character, String> huffmanMap = new HashMap<>();
        String[] lines = S.split("\n");

        for (String line : lines) {
            String[] parts = line.split(":");
            char character = parts[0].charAt(0);
            String code = parts[1];
            huffmanMap.put(character, code);
        }

        return huffmanMap;
    }
    //计算频率
    public static Map<Character, Integer> calculateFrequencies(String str) {
        Map<Character, Integer> frequencyMap = new HashMap<>();

        for (char ch : str.toCharArray()) {
            if(ch=='\n') continue;
            frequencyMap.put(ch, frequencyMap.getOrDefault(ch, 0) + 1);
        }

        return frequencyMap;
    }
    //根据哈希表建树
    public static TreeNode buildHuffmanTree(Map<Character, Integer> frequencyMap) {
        PriorityQueue<TreeNode> pq = new PriorityQueue<>(new HuffmanComparator());

        for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
            char ch = entry.getKey();
            int freq = entry.getValue();
            TreeNode node = new TreeNode(ch, freq);
            pq.offer(node);
        }

        while (pq.size() > 1) {
            TreeNode leftChild = pq.poll();
            TreeNode rightChild = pq.poll();
            int sum = leftChild.freq + rightChild.freq;

            TreeNode parent = new TreeNode('\0', sum);
            parent.left = leftChild;
            parent.right = rightChild;

            pq.offer(parent);
        }

        return pq.poll();
    }
    //生成哈夫曼编码
    public static Map<Character, String> generateHuffmanCodes(TreeNode root) {
        Map<Character, String> huffmanCodes = new HashMap<>();
        generateCodes(root, "", huffmanCodes);
        return huffmanCodes;
    }
    //生成哈夫曼编码
    public static void generateCodes(TreeNode node, String code, Map<Character, String> huffmanCodes) {
        if (node == null) {
            return;
        }

        if (node.left == null && node.right == null) {
            huffmanCodes.put(node.ch, code);
            return;
        }

        generateCodes(node.left, code + "0", huffmanCodes);
        generateCodes(node.right, code + "1", huffmanCodes);
    }
    //打印哈夫曼编码
    public static void printHuffmanCodes(Map<Character, String> huffmanCodes, JTextArea jta2) {
        String content = "";
        for (Map.Entry<Character, String> entry : huffmanCodes.entrySet()) {
            char ch = entry.getKey();
            String code = entry.getValue();
            content += ch + ":" + code + "\n";
            jta2.setText(content);
        }
    }
}

class TreeNode {
    char ch;
    int freq;
    TreeNode left;
    TreeNode right;

    public TreeNode(char ch, int freq) {
        this.ch = ch;
        this.freq = freq;
    }
}

class HuffmanComparator implements Comparator<TreeNode> {
    public int compare(TreeNode node1, TreeNode node2) {
        return node1.freq - node2.freq;
    }
}


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值