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. (function($, window, document) {}) jQuery 调用解决与其他javascript库冲突的写法

    将函数包在红色字体内部,可以解决$符号与其他插件的冲突. <script type="text/javascript"> (function($, window, do ...

  2. 通过javascript在网页端生成zip压缩包并下载

    zip.js是什么 zip.js的github项目地址:http://gildas-lormeau.github.io/zip.js/ 通过zip.js封装一个能在网页端生成zip文件的插件, 直接在 ...

  3. mysql-拼接字段concat,concat_ws函数

    Mysql的查询结果行字段拼接,可以用下面两个函数实现: 1. concat函数 mysql') from test ; +---------------------+ ') | +--------- ...

  4. Mysql-报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost

    报错:1130-host ... is not allowed to connect to this MySql server   解决方法: 1. 改表法. 可能是你的帐号不允许从远程登陆,只能在l ...

  5. css 去除 a,checkbox 框 出现虚线

    在开发过程中遇到checkbox框,第一次遇到还以为是系统自带的是这样 后来发现不是那样, 我们可以在使用css 去掉出现的虚线框,以下是我的解决方案代码: /* checkbox 去掉虚框*/:fo ...

  6. Java面试知识的认知描述

    连接池:同时操作连接数据库,创建一个连接池,池子里创建一万个数据库链接.根据系统运行情况关闭链接.高峰期链接达到最大MAX进行排队,对在用的链接实现失效时间.有几种:tomcat请求服务器(serve ...

  7. GameObject.Instantiate(游戏体的实例化),角色的选择

    using UnityEngine; using System.Collections; public class CharacterCreation : MonoBehaviour { public ...

  8. 深入理解Java多态机制

    从字节码层面来看,Java中的所有方法调用,最终无外乎转换为如下几条调用指令. invokestatic: 调用静态方法. invokespecial: 调用实例构造器<init>方法,私 ...

  9. Visual Studio版本号对应表

    从一个外行角度看,VC/VS有3种版本号,具备一定的迷惑性:(xx表示具体的数字) MSVC++ xx(VC版本 eg. VC6.0) _MSC_VER xx VisualStudio xx(VS版本 ...

  10. Mvc action间的传值

    1, Mvc action间的传值? TempData["student"] ="123" 在<走入asp.net mvc不归路>系列文章5中,介绍 ...