我们在字符串中见到过CompareTo方法,知道这个方法是用于比较字符串顺序的,根据字典顺序进行排序。Java中很多类也都有CompareTo方法,甚至于排序算法的底层组成也是依赖于比较的,而这个比较就是依赖于各种数据类型的CompareTo或者Compare方法。Java中所有的compareTo方法都源于一个共同的接口,那就是Comparable。这个接口只有一个方法,那就是CompareTo。所有想要具有比较功能的类,都建议实现这个接口,而非是自己定义这个功能,这是面向对象的概念(将具有相同功能的事物抽象到一个共同的类或接口),并且为了多态也建议通过实现接口来进行向上转型,通过接口来操作具体实现,这也是面向接口编程要求我们做的。下面我们来具体了解一下Comparable接口。
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
在创建哈夫曼树的时候用到了给list中的元素排序:
public class Node implements Comparable<Node> {
private int value;
private Node left;
private Node right; public Node(int value) {
this.value = value;
} @Override
public String toString() {
return "[value=" + value + "]";
} public int compareTo(Node o) {
// return this.value - o.value;//从小到大
return -(this.value - o.value);//从大到小
} public int getValue() {
return value;
} }
public class TestHaffmanTree {

    public static void main(String[] args) {
int[] arr = {3,7,8,29,5,11,23,14};
Node nodeHaffman = creatHaffman(arr);
System.out.println(nodeHaffman);
} public static Node creatHaffman(int[] arr) {
//先使用数组中的所有元素创建若干二叉树
List<Node> list = new ArrayList<Node>();
for (int value : arr) {
list.add(new Node(value));
}
//循环处理
while(list.size()>1) {
//排序
Collections.sort(list);
//取出权值最小的两颗二叉树(已经排好序了,是最后两个)
Node left = list.get(list.size()-1);
Node right = list.get(list.size()-2);
//创建一颗新的二叉树
Node parent = new Node(left.getValue()+right.getValue());
//把原来的两个二叉树移除
list.remove(left);
list.remove(right);
//将新的二叉树放入list中
list.add(parent);
}
//System.out.println(list.size());
return list.get(0);//剩下的最后那一个就是哈夫曼树了
} }

接口--Comparable接口【哈夫曼树】的更多相关文章

  1. 赫夫曼树JAVA实现及分析

    一,介绍 1)构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点. 2)使用最小堆来选取频率最小的节点,有助于提高算法效率,因为要选频率最低 ...

  2. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

  3. 高级数据结构---赫(哈)夫曼树及java代码实现

    我们经常会用到文件压缩,压缩之后文件会变小,便于传输,使用的时候又将其解压出来.为什么压缩之后会变小,而且压缩和解压也不会出错.赫夫曼编码和赫夫曼树了解一下. 赫夫曼树: 它是一种的叶子结点带有权重的 ...

  4. Java数据结构(十二)—— 霍夫曼树及霍夫曼编码

    霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...

  5. Poj 3253 Fence Repair(哈夫曼树)

    Description Farmer John wants to repair a small length of the fence around the pasture. He measures ...

  6. (哈夫曼树)HuffmanTree的java实现

    参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...

  7. 哈夫曼树(三)之 Java详解

    前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

  8. java实现哈弗曼树和哈夫曼树压缩

    本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...

  9. java实现哈夫曼树进行文件加解压

    目录 1.哈夫曼树简述 2.构造树的节点 3.构造哈夫曼树的类(压缩) 4.构造哈夫曼树的类(解压) 5.整体工程文件(包括测试类) 6.结果 7.参考链接 1.哈夫曼树简述 给定n个权值作为n个叶子 ...

随机推荐

  1. cordova闪屏插件插件使用:cordova-plugin-splashscreen

    欢迎页本地插件,默认建议包含.启动本地应用时显示指定的图片(启动页) 1. 添加插件:cordova plugin add cordova-plugin-splashscreen 2. 调用方法:

  2. 08机器学习实战之BP神经网络

    1. 背景:      1.1 以人脑中的神经网络为启发,历史上出现过很多不同版本      1.2 最著名的算法是1980年的 backpropagation  2. 多层向前神经网络(Multil ...

  3. java8_api_jdbc

    jdbc-1    jdbc的概念    驱动的分类    连接oracle数据库        与任何表格数据源交互        代码编写步骤        加载驱动            Cla ...

  4. 关于PCA

    PCA是常见的降维技术. 对于使用PCA来进行降维的数据,需要进行预处理,是指能够实现均值为0,以及方差接近.如何来确定到底哪个维度是"主成分"?就要某个axis的方差. 为什么要 ...

  5. java 运算符的优先级比较

    口诀:淡云一笔安洛三福 单目>算数运算符>移位>比较>按位>逻辑>三目>赋值 单目运算符:+,-,++,-- 算数运算符:+,-,*,/,% 移位运算符:&l ...

  6. python随机数学习笔记

    #coding:utf-8 import random # random.randint(1,10)产生1,10的随机整数 for i in range(1,5): ranint = random.r ...

  7. 一般处理程序获取get,post数据

    ashx具体代码: public class GuanWangWC : IHttpHandler { public void ProcessRequest(HttpContext context) { ...

  8. java中的线程中断

    线程会根据中断标志位 自行了断自己 https://www.cnblogs.com/yangming1996/p/7612653.html 如何停止线程 1.设置中断标识位 2.sleep时设置中断标 ...

  9. ignoreDependencyType(Class class)方法使用

    该方法字面意思是忽略依赖类,注释给出的解释是在自动装配时忽略指定类型的依赖注入. 经过我在网上查的资料,发现自动装配有两种方式: 一种是在xml配置文件中的<beans>标签中配置一个属性 ...

  10. kong插件应用

    插件概述 插件之于kong,就像Spring中的aop功能.在请求到达kong之后,转发给后端应用之前,你可以应用kong自带的插件对请求进行处理,合法认证,限流控制,黑白名单校验,日志采集等等.同时 ...