JAVA中常用接口的介绍及使用示例 java lang Comparable
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
JAVA中常用接口的介绍及使用示例:java.lang.Comparable
JKD中说明
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射(接口java.util.SortedMap<K,V>)中的键或有序集合(接口 java.util.SortedSet<E>)中的元素,无需指定比较器(接口 java.util.Comparator<T>)。
对于类 C的每一个 e1和 e2来说,当且仅当 e1.compareTo(e2) == 0与 e1.equals(e2)具有相同的 boolean值时,类 C的自然排序才叫做与 equals一致。注意,null不是任何类的实例,即使 e.equals(null)返回 false,e.compareTo(null)也将抛出 NullPointerException。
建议(虽然不是必需的)最好使自然排序与 equals一致。这是因为在使用自然排序与 equals不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。
例如,如果将两个键 a和 b添加到没有使用显式比较器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那么第二个 add 操作将返回 false(有序集合的大小没有增加),因为从有序集合的角度来看,a和 b是相等的。
实际上,所有实现 Comparable的 Java核心类都具有与 equals一致的自然排序。java.math.BigDecimal是个例外,它的自然排序将值相等但精确度不同的 BigDecimal对象(比如 4.0和 4.00)视为相等。
从数学上讲,定义给定类 C上自然排序的关系式如下:
{(x, y)|x.compareTo(y) <= 0}。
整体排序的商是:
{(x, y)|x.compareTo(y) == 0}。
它直接遵循compareTo 的协定,商是C 的等价关系,自然排序是C 的整体排序。当说到类的自然排序与 equals 一致时,是指自然排序的商是由类的equals(Object)方法定义的等价关系。
{(x, y)|x.equals(y)}。
此接口是Java Collections Framework的成员。
笔者注:注意字符串与数字在一起的时候的排序,这个时候数字被当做字符处理,排序时需要指定比较器才可以比较准确。如将“loop1,loop5,loop11,loop2,loop13”进行排序,如果直接采用Collections.sort(或Arrays.sort),得出的结果将会是:loop1,loop11,loop13,loop2,loop5。参见实例二部份中自定义比较器的实现,就可以得出正确的排序。
示例一:
publicvoidcomparableTest() {
//TODO Auto-generated method stub
String a="1",b="1";
System.out.println(a.compareTo(b));
Integer c=1,d=1;
System.out.println(c.compareTo(d));
}
示例二:
/**
*将传入的HashMap,将其中值为子HashMap的键进行排序,排好序后以List返回,List中存放的是排好序的、原HashMap的键。
*该排序通过Collections的sort方法,Collections是Collection的一个工具类,自定义排序,需要实现自定义的Comparator,默认的排序是按字符的ASCII进行排序的。
*其中需要注意的时,被排序的Map,必须具有相似的结构、相同的前缀,否则会报错,如List的键如下:
*Mapmap=newHashMap();
*map.put("loop7","7");
*map.put("loop3","3");
*map.put("loop1","1");
*map.put("loop15","15");
*...
*他们都有相同的前缀loop,并且前缀中不能够包括数字,前缀可以是任意不包括数字的字符串.也就是说传入的HashMap,其子HashMap的键,一定要按上面的规则,否则将会报错.
*@parammap 包括待排序键的HashMap
*@return 存放排好序后的HashMap的键的List
*/
privatestatic List hashMapKey2SortedList(Map map){
List list = new ArrayList();
Iterator iterator=map.keySet().iterator();
while(iterator.hasNext()){
String key=(String)iterator.next();
Object obj=map.get(key);
if(objinstanceof Map){
list.add(key);
}
}
/**
*排序通过实现自定义比较器进行排序
*/
Collections.sort(list,new Comparator(){
publicint compare(Object o1, Object o2) {
String key1=o1.toString();
String key2=o2.toString();
String prefix="";
for(int i=0;i<key1.length();i++){
String tmp=key1.substring(i,i+1);
try{
Integer.parseInt(tmp);
}catch(Exception e){
prefix+=tmp;
}
}
key1=key1.replace(prefix, "");
key2=key2.replace(prefix, "");
int key1_int=0;
int key2_int=0;
try{
key1_int=Integer.parseInt(key1);
}catch(NumberFormatException e){
}
try{
key2_int=Integer.parseInt(key2);
}catch(NumberFormatException e){
}
return key1_int-key2_int;
}
});
return list;
}
本文出自:冯立彬的博客
给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
JAVA中常用接口的介绍及使用示例 java lang Comparable相关推荐
- php simpledateformat,Java中SimpleDateFormat的用法介绍(代码示例)
本篇文章给大家带来的内容是关于Java中SimpleDateFormat的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.为什么要使用SimpleDateFo ...
- java中Mark接口_JVM源码分析之Java对象头实现
原标题:JVM源码分析之Java对象头实现 原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 "365篇原创计划"第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Ja ...
- java中model接口与实现类_关于java中dao,model,service,impl,util的理解
dao 与数据库的操作,增删改查等方法 model 一般都是javabean对象,例如与数据库的某个表相关联. service 供外部调用,等于对dao,model等进行了包装. impl 定义的接口 ...
- Java中常用的类,包,接口
Java中常用的类,包,接口 包名 说明 java.lang 该包提供了Java编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread等,不使用 ...
- 六、Java中常用的API(通过包进行分类)————File类、IO流
一.util工具包下的补充类 介绍io包之前,先补充介绍几个常用的工具类 1.Scanner类 什么是Scanner类 一个可以解析基本类型和字符串的简单文本扫描器. 例如,以下代码使用户能够从 Sy ...
- java高级特性2_Java高级特性 第2节 java中常用的实用类(1)
一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...
- java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing
java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...
- java中常用API、Scanner类、匿名对象、Random类、ArrayList类、对象数组
java中常用API: API:Application Programming Interface,应用程序编程接口.Java API是JDK中提供给我们使用的类的说明文档.这些类将底层的代码实现封装 ...
- java中的接口是什么?
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类,编写接口 ...
最新文章
- [转] ASP.NET MVC3 路由和多数据集的返回
- Node.js 多版本安装方式
- IHttpHandler的学习(0)
- thinkphp5.0 使用paginate 分页后 foreach 循环体内不能处理数据的解决办法
- pd.get_dummies()
- 对于指针与malloc函数关系的研究,以及指针的赋值。
- data-packed volume container - 每天5分钟玩转 Docker 容器技术(43)
- 图书馆学应掌握计算机知识,图书馆学专业基础知识点整理.doc
- [转]关于管理的经典故事(员工激励)
- ArcGis 拓扑检查——狭长角锐角代码C#
- 函数发生器输出电压值会与设定值不同
- 电驴搜索服务器正在连接,电驴未连接到服务器是什么原因?
- dfuse Search 是所有 EOSIO 开发者的必备工具
- 【解决】路由器设置成交换机使用
- 爬取图片,并按比例划分数据集
- 计算机网络智能小区综合分布线系统的总结,智能住宅小区综合布线系统的构建...
- burpsuite.jar文件双击打不开解决方法
- 互联网产品经理常用工具有哪些
- 三种标识的计算机和U盘,了解这三种方法并轻松加密U盘
- 颜值爆表功能强大,乐Pro3双摄AI版暗夜黑版5月17日预约
热门文章
- 数据膨胀了?你的数仓又没有空间了?
- 有了这三个神器工具集,应用开发想怎么玩就怎么玩
- 代码 or 指令,浅析ARM架构下的函数的调用过程
- 【华为云技术分享】玩转云上数据湖,解析Serverless 技术落地
- 【华为云技术分享】ARM体系结构基础(2)
- 无码系列-7-代码的语文修养_上篇
- 关于Python的随机数模块,你必须要掌握!
- matlab excel 进程,Matlab使用xlsread, xlswrite函数导致excel进程无法终止的问题
- daemons java,java.lang.ThreadGroup.isDaemon()方法实例
- LIF模型及其变种 Training Spiking Deep Networks for Neuromorphic Hardware