一.java中的compareto方法

1.返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值

String a1 = "a";

String a2= "c";

System.out.println(a1.compareTo(a2));//结果为-2

2.即参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值,

String a1 = "aa";

String a2= "ad";

System.out.println(a1.compareTo(a2));//结果为-3

3.如果两个字符串不一样长,可以参与比较的字符又完全一样,则返回两个字符串的长度差值

String a1 = "aa";

String a2= "aa12345678";

System.out.println(a1.compareTo(a2));//结果为-8

4.返回为正数表示a1>a2, 返回为负数表示a1

5.数字类型不能用compareTo,nt跟int的比较不能用compareTo方法,直接用大于(>)小于(

int num1 = 4;int num2 = 5;

num1.compareTo(num2);//Cannot invoke compareTo(int) on the primitive type int

你可以先把你的int型变量转换成String再进行比较

int num1 = 4;int num2 = 5;//parse int to String

System.out.println((num1+"").compareTo(num2+""));//-1

System.out.println(new Integer(num1).toString(). compareTo(new Integer(num2).toString()));//-1

System.out.println(String.valueOf(num1).compareTo(String.valueOf(num2)));//-1

6.compareToIgnoreCase忽略大小写

不考虑大小写,按字典顺序比较两个字符串。此方法返回一个整数,它的正负号是调用 compareTo 的正负号,调用时使用了字符串的规范化版本,其大小写差异已通过对每个字符调用 Character.toLowerCase(Character.toUpperCase(character)) 得以消除。

注意,此方法不 考虑语言环境,因此可能在某些特定的语言环境中产生不理想的排序。java.text 包提供 Collators 来完成语言环境敏感的排序。

7.int型可以直接比较,所以没有用到compareTo比较,如果声明的是Date、String、Integer、或者其他的,可以直接使用compareTo比较,

Integer n1 = 5;

Integer n2= 6;

System.out.println(n1.compareTo(n2));//-1

二. Comparable接口中的compareTo

compareTo方法内必须做非空判断(规范问题),当然int类型就不用了。

注意事项:

1、模型必须实现Comparable接口

2、Collection.sort(list)会自动调用compareTo,如果没有这句,list是不会排序的,也不会调用compareTo方法

3、如果是数组则用Arrays.sort(a)方法

注意要非空判断,这里实例就不判断了

private intbookId;privateString bookName;private intbookPrice;

@Overridepublic intcompareTo(Book o) {//TODO Auto-generated method stub//return this.bookPrice-o.bookPrice;//按价格排序 升序//return o.bookPrice-this.bookPrice;//按价格排序 降序//return this.bookName.compareTo(o.bookName);//按书名排序 升序//先按 id 再按价格 最后按书名排序 升序

int result = this.bookId -o.bookId;if(result == 0){

result=this.bookPrice -o.bookPrice;

}if(result == 0){

result= this.bookName.compareTo(o.bookName);

}returnresult;

}

packagecom.my.test.compare;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Collections;importjava.util.List;public classTestCompare {public static voidmain(String[] args) {

Book b1= new Book(1, "语文", 20);

Book b2= new Book(2, "数学", 10);

Book b3= new Book(5, "英语", 10);

Book b4= new Book(4, "化学", 50);

Book b5= new Book(3, "化学", 10);//Book b6 = null;//不能为null,Collections.sort调用compareTo会报空指针异常

List books = new ArrayList<>();

books.add(b1);

books.add(b2);

books.add(b3);

books.add(b4);

books.add(b5);

System.out.println("Collections 排序前");for(Book book : books) {

System.out.println(book);

}

Collections.sort(books);

System.out.println("Collections 排序后");for(Book book : books) {

System.out.println(book);

}

Book[] b= new Book[5];

System.out.println(b.length);

b[0] =b1;

b[1] =b2;

b[2] =b3;

b[3] =b4;

b[4] =b5;

System.out.println("Arrays 排序前");for(Book book : b) {

System.out.println(book);

}

Arrays.sort(b);

System.out.println("Arrays 排序后");for(Book book : b) {

System.out.println(book);

}

}

}

在应用中我们为了好判断状态,一般处理为

if(this.bookId

}else if(this.bookId>o.bookId){return 1;

}else{return 0;

}

返回值为 1,0.-1:

三。 Comparator接口

源码:

@FunctionalInterfacepublic interface Comparator{//核心方法,用来比较两个对象,如果o1小于o2,返回负数;等于o2,返回0;大于o2返回正数

intcompare(T o1, T o2);//好像很少用到,一般都用对象自带的equals

booleanequals(Object obj);/**-----------下面的都是JDK1.8新增的接口,挑几个放进去----------*/

//返回反向排序比较器

default Comparatorreversed() {return Collections.reverseOrder(this);

}//根据名字知道,先进行compare比较后,再进行一次比较

default Comparator thenComparing(Comparator super T>other) {

Objects.requireNonNull(other);return (Comparator & Serializable) (c1, c2) ->{int res =compare(c1, c2);return (res != 0) ?res : other.compare(c1, c2);

};

}//对int类型的key进行比较

public static Comparator comparingInt(ToIntFunction super T>keyExtractor) {

Objects.requireNonNull(keyExtractor);return (Comparator &Serializable)

(c1, c2)->Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));

}//返回正常顺序的比较器

public static > ComparatornaturalOrder() {return (Comparator) Comparators.NaturalOrderComparator.INSTANCE;

}

}

一起来看一下如何使用,先来看一下JDK1.8以前的用法:

Collections.sort(books,new Comparator() {

@Overridepublic intcompare(Book o1, Book o2) {//TODO Auto-generated method stub

return o1.getBookPrice() -o2.getBookPrice();

}

});

或者创建一个比较器

packagecom.my.test.compare;importjava.util.Comparator;public class SimpleCompator implements Comparator{

@Overridepublic intcompare(Book o1, Book o2) {//TODO Auto-generated method stub

return o1.getBookPrice() -o2.getBookPrice();

}

}

Collections.sort(books,new SimpleCompator());

JDK1.8以前的用法要自己手动实现Comparator接口,然后调用Collections.sort(),传入实现类来完成排序,非常麻烦,而JDK1.8则相对来说简单了很多:

Collections.sort(books,(Book a, Book b) -> { return a.getBookPrice()-b.getBookPrice(); });

或者可以简单的写为

Collections.sort(books,(Book a, Book b) -> a.getBookPrice()-b.getBookPrice());

甚至,我们可以不使用Collections.sort:

books.sort((Book a, Book b) -> a.getBookPrice()-b.getBookPrice() );

详见:http://www.manongjc.com/article/8005.html

compator 在 treeMap 中的 应用(基于key的排序):

treeMap默认的是基于key的从小到大 的排列

自定义排序也是基于key的,如果key object类型 可以自定义各种排序

TreeMap treeMap = new TreeMap<>((String a,String b)-> b.compareTo(a));//降序

TreeMap treeMap = new TreeMap<>((String a,String b)-> a.compareTo(b));//升序

TreeMap的按value排序(转换成entry list 然后排序)汉字是按ascii码排序的,不是汉语拼音

Person p1 = new Person(1, "A小红");

Person p2= new Person(5, "D赵明");

Person p3= new Person(2, "W孙宇");

Person p4= new Person(9, "C黎明");

TreeMap treeMap = new TreeMap<>();

treeMap.put("45", p1);

treeMap.put("12", p2);

treeMap.put("85", p3);

treeMap.put("33", p4);

List> entries = new ArrayList<>(treeMap.entrySet());

Collections.sort(entries,

(Map.Entry e1, Map.Entry e2) ->((Person) e1.getValue()).getPersonName()

.compareTo(((Person) e2.getValue()).getPersonName()));

System.out.println("按名字顺序排列");for (Entryentry : entries) {

System.out.println(entry.getValue());

}

java compareto 中文_java中的compareto方法的详细介绍相关推荐

  1. java 初始化顺序_Java中对象初始化顺序的详细介绍

    前言 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com ...

  2. java getbytes 长度_JAVA中的getBytes()方法

    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方 ...

  3. java compareTo 整数_Java中的compareTo()函数是怎么用的?

    展开全部 compareTo() 方法用于将 Number 对象与方32313133353236313431303231363533e4b893e5b19e31333366306535法的参数进行比较 ...

  4. java 过滤器 中文_java中Filter过滤器解决中文乱码办法

    java中Filter过滤器解决中文乱码办法 发布时间:2020-04-07 10:19:09 来源:亿速云 阅读:16 作者:小新 这篇文章主要为大家详细介绍了java中Filter过滤器解决中文乱 ...

  5. java定义常量_JAVA中定义常量方法

    JAVA中定义常量方法 (2013-01-28 14:30:19) 标签: it 一.常量定义的基本注意事项. 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字) ...

  6. java finalize 作用_java中的finalize方法有什么作用

    java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法. finalize()方法是Object类中提供的一个方 ...

  7. java equals覆盖_java 中覆盖equals() 方法

    在java中覆盖 equals() 起因 这周软件构造实验中第三题需要判断自建类的相等性. 例如如下代码 class Person{ String name; public Person(String ...

  8. java 异常 中文_Java中所有的运行时异常,带中文解释

    展开全部 算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:Negat ...

  9. java arrays.aslist()_Java中Arrays.asList()方法详解及实例

    Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...

最新文章

  1. 关于vue项目中在js中引入图片问题
  2. 35.页面置换算法有哪些?
  3. 从零开始,带你玩转一站式实时数仓Hologres
  4. 拉5000万存款,银行客户经理能拿40万奖金?
  5. python序列化和反序列化_Python 中 json 数据序列化和反序列化
  6. LeetCode 面试题 03 数组中重复的数字
  7. leetcode22. 括号生成(回溯)
  8. CentOs6.5 更新python2.7,以及tab自动补全
  9. 读书笔记∣疯狂XML讲义
  10. java arrays_Java的Arrays方法分析
  11. python设计模式-模板方法模式 1
  12. Java面试题 - 数据结构与算法
  13. oracle 客户端怎样配置,oracle 之客户端配置
  14. 如何提高软件测试效率
  15. 【3D激光SLAM(二)】Velodyne激光SLAM学习之Velodyne-16线激光雷达在Jetson Nano上的配置使用
  16. Java XML分析技术: StAX, SAX, DOM, DOM4j, JDOM
  17. css选择器nth-child
  18. java 数据类型的基本类型
  19. 我的世界java版如何装mod_我的世界MOD怎么安装 MOD安装简易教程
  20. 一次网站的性能优化之路 -- 天下武功,唯快不破

热门文章

  1. JAVAWEB之css
  2. Kettle(2):安装Kettle
  3. android手机版打不开,游戏王决斗链接安卓版打不开 游戏进不去解决方法
  4. 02-java语言基础
  5. 斐波那契数列 递归与非递归算法实现
  6. MacOS Python安装which is required to install pyproject.toml-based projects解决办法
  7. PHP中使用array_pad()函数
  8. Android studio中.setText使用
  9. 面试题--位操作---延伸到一个用空间换取时间效率的例子
  10. mysql 设计超市订单图_利用maven模板写一个超市订单管理系统(1)项目基础搭建