1、先创建一个树节点类(泛型类),为了方便使用集合的排序方法,泛型类要实现泛型接口Comparable,代码如下

package com.hjp.huffman;

/**
* Created by JiaPeng on 2016/12/28.
*/
public class Node<T> implements Comparable<Node<T>> { private T data;
private int weight;
private Node<T> left;
private Node<T> right;
private String codeStr; public T getData() {
return data;
} public void setData(T data) {
this.data = data;
} public int getWeight() {
return weight;
} public void setWeight(int weight) {
this.weight = weight;
} public Node<T> getLeft() {
return left;
} public void setLeft(Node<T> left) {
this.left = left;
} public Node<T> getRight() {
return right;
} public void setRight(Node<T> right) {
this.right = right;
} public Node(T data, int weight) {
this.data = data;
this.weight = weight;
} public String getCodeStr() {
return codeStr;
} public void setCodeStr(String codeStr) {
this.codeStr = codeStr;
} @Override
public int compareTo(Node<T> o) {
if (o.weight > this.weight) {
return 1;
} else if (o.weight < this.weight) {
return -1;
}
return 0;
} @Override
public String toString() {
return "data:" + this.data + ",weight:" + this.weight + "; ";
}
}

树节点类

2、编写泛型静态方法,构造Haffman树及对树编码,代码如下

package com.hjp.huffman;

import java.util.*;

/**
* Created by JiaPeng on 2016/12/28.
*/
public class HuffmanTree { public static <T> Node<T> createTree(List<Node<T>> nodes) {
while (nodes.size() > 1) {
int nodesLen = nodes.size();
Collections.sort(nodes);
Node<T> left = nodes.get(nodesLen - 1);
Node<T> right = nodes.get(nodesLen - 2);
Node<T> parent = new Node<T>(null, left.getWeight() + right.getWeight());
parent.setLeft(left);
parent.setRight(right);
nodes.remove(left);
nodes.remove(right);
nodes.add(parent);
}
return nodes.get(0);
} public static <T> List<Node<T>> breath(Node<T> root) {
List<Node<T>> list = new ArrayList<Node<T>>();
Queue<Node<T>> queue = new LinkedList<Node<T>>();
queue.add(root);
StringBuilder stringBuilder = new StringBuilder();
while (!queue.isEmpty()) {
Node<T> pNode = queue.poll();
list.add(pNode);
Node<T> leftNode = pNode.getLeft();
String codeStr = pNode.getCodeStr();
if (leftNode != null) {
if (codeStr != null && !"".equals(codeStr)) {
leftNode.setCodeStr(codeStr + "0");
} else {
leftNode.setCodeStr("0");
}
queue.add(leftNode);
}
Node<T> rightNode = pNode.getRight();
if (rightNode != null) {
if (codeStr != null && !"".equals(codeStr)) {
rightNode.setCodeStr(codeStr + "1");
} else {
rightNode.setCodeStr("1");
}
queue.add(rightNode);
}
}
return list;
} }

构造树方法及编码方法

3、测试方法

package com.hjp.huffman;

import com.hjp.data.JSONUtil;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; /**
* Created by JiaPeng on 2016/12/28.
*/
public class testMain { public static void main(String[] args){
List<Node<String>> nodes = new ArrayList<Node<String>>();
nodes.add(new Node<String>("b", 5));
nodes.add(new Node<String>("a", 7));
nodes.add(new Node<String>("d", 2));
nodes.add(new Node<String>("c", 4));
Node<String> root = HuffmanTree.createTree(nodes);
List<Node<String>> huffmanList=HuffmanTree.breath(root);
Map<String,String> huffmanMap=new LinkedHashMap<String, String>();
for (int i = 0; i < huffmanList.size(); i++) {
Node<String> curNode=huffmanList.get(i);
if(curNode.getData()!=null){
huffmanMap.put(curNode.getData(),curNode.getCodeStr());
}
}
System.out.println(JSONUtil.toJson(huffmanMap));
} }

测试方法

java实现Haffman编码的更多相关文章

  1. 理清Java中的编码解码转换

    1.字符集及编码方式 概括:字符编码方式及大端小端 详细:彻底理解字符编码 可以通过Charset.availableCharsets()获取Java支持的字符集,以JDK8为例,得到其支持的字符集: ...

  2. Java的默认编码

    摘要: 1.Java的默认编码内容: 1.Java的默认编码 java的src.zip包中的java.nio.charset.Charset类中defaultCharset()方法说明java的编码类 ...

  3. ACM Haffman编码

    Haffman编码 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...

  4. java String.getBytes()编码问题——String.getBytes(charset)

    String的getBytes()方法是得到一个字串的字节数组,这是众所周知的.但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组.如果你在使用这个方法时不考虑到这一点,你会发现在一个平 ...

  5. Delphi和JAVA用UTF-8编码进行Socket通信例子

    最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...

  6. java实现文件编码监测(转)

    chardet是mozilla自动字符集探测算法代码的java移植.这个算法的最初作者是frank Tang,C++源代码在http://lxr.mozilla.org/mozilla/source/ ...

  7. java实现文件编码监测

    java实现文件编码监测 最近在做一个文档的翻译项目,可文档的编码不知道,听头疼的.尝试了很多方法最后发现JCharDet这个工具可以轻松解决这个问题.于是作此笔记希望日后提醒自己以及帮助又需要的人. ...

  8. Haffman编码(haffman树)

    Haffman编码 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...

  9. windows下编译java源文件的编码错误

    import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...

随机推荐

  1. Value cannot be null or empty. 参数名: contentPath

    代码:<img src="@Url.Content(item.ThumbPath)" width="160" height="250" ...

  2. ViewPager

    1.ViewPager的功能为实现视图滑动 在主布局里边加入: <android.support.v4.view.ViewPager 这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载 ...

  3. 在Winform中播放视频等【DotNet,C#】

    在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件 ...

  4. Shell配置_配置IP

    1.setup 打开图形化页面 a) 选择网络配置 b) 选择设置配置   c) 选择第一个网卡     2.启动网卡(第一个网卡)      vim /etc/sysconfig/network-s ...

  5. mysql之路【第三篇】

    1,查看表的结构 desc   表名; 查看表的详细结构 show   create  table; show   create  table   \G;   (加上G格式化输出), 2,修改表 2. ...

  6. codevs1227

    费用流,其实是求传输一个容量为k的流的最大费用.主要是建图.原点为0,和1连上一条容量为k,费用为0的边,中间每个点拆成两个1和2,连上一条边,容量为k,费用为c,再连一条容量为比k大,费用为0的边, ...

  7. ajax技术应用(转)

    ajax简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不 ...

  8. 安装python-docx

    安装环境: windows 7 64位 python 3.4.2 64位 说明: 用pip install python-docx不行,当装lxml时出现错误,一直卡在那. 安装非官方的版本,如下图, ...

  9. Java多线程学习(吐血超详细总结)

    本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的 ...

  10. Java产生随机数

    前言: 每一门程序设计语言基本都具有一个随机函数,而Java当中产生随机数的方式不拘一格.而且其中的Random工具类还有着更深入的应用,但本文仅对比3种产生随机数的方式,就不深入扩展分析其内部工具类 ...