compare怎么读?_compare…to

compare怎么读?_compare…tojava中的compareto方法的详细介绍java中的compareto方法的详细介绍Java Comparator接口实例讲解(抽象方法、常用静态/默认方法) 一.java中的compareto方法1.返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母

java中的compareto方法的详细介绍   java中的compareto方法的详细介绍   Java Comparator接口实例讲解(抽象方法、常用静态/默认方法)       一.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<a2, 返回为0表示a1==a2;   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<T>接口中的compareTo   compareTo方法内必须做非空判断(规范问题),当然int类型就不用了。   注意事项:   1、模型必须实现Comparable<T>接口   2、Collection.sort(list)会自动调用compareTo,如果没有这句,list是不会排序的,也不会调用compareTo方法   3、如果是数组则用Arrays.sort(a)方法   注意要非空判断,这里实例就不判断了   private int bookId; private String bookName; private int bookPrice; @Override public int compareTo(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); } return result; }   package com.my.test.compare; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class TestCompare { public static void main(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<Book> 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<o.bookId){ return -1; }else if(this.bookId>o.bookId){ return 1; }else{ return 0; }       返回值为 1,0.-1:       三。 Comparator接口   源码:   @FunctionalInterface public interface Comparator<T> { // 核心方法,用来比较两个对象,如果o1小于o2,返回负数;等于o2,返回0;大于o2返回正数 int compare(T o1, T o2); // 好像很少用到,一般都用对象自带的equals boolean equals(Object obj); /———–下面的都是JDK1.8新增的接口,挑几个放进去———-*/ //返回反向排序比较器 default Comparator<T> reversed() { return Collections.reverseOrder(this); } //根据名字知道,先进行compare比较后,再进行一次比较 default Comparator<T> thenComparing(Comparator<? super T> other) { Objects.requireNonNull(other); return (Comparator<T> & Serializable) (c1, c2) -> { int res = compare(c1, c2); return (res != 0) ? res : other.compare(c1, c2); }; } //对int类型的key进行比较 public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator<T> & Serializable) (c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2)); } //返回正常顺序的比较器 public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() { return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE; } }   一起来看一下如何使用,先来看一下JDK1.8以前的用法:   Collections.sort(books,new Comparator<Book>() { @Override public int compare(Book o1, Book o2) { // TODO Auto-generated method stub return o1.getBookPrice() – o2.getBookPrice(); } });   或者创建一个比较器   package com.my.test.compare; import java.util.Comparator; public class SimpleCompator implements Comparator<Book> { @Override public int compare(Book o1, Book o2) { // TODO Auto-generated method stub return o1.getBookPrice() -o2.getBookPrice(); } }       Collections.sort(books,new SimpleCompator());   JDK1.8以前的用法要自己手动实现Comparator接口,然后调用,传入实现类来完成排序,非常麻烦,而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<String, Person> treeMap = new TreeMap<>((String a,String b)-> b.compareTo(a));//降序   TreeMap<String, Person> 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<String, Person> treeMap = new TreeMap<>(); treeMap.put(“45”, p1); treeMap.put(“12”, p2); treeMap.put(“85”, p3); treeMap.put(“33”, p4); List<Map.Entry<String, Person>> entries = new ArrayList<>(treeMap.entrySet()); Collections.sort(entries, (Map.Entry<String, Person> e1, Map.Entry<String, Person> e2) -> ((Person) e1.getValue()).getPersonName() .compareTo(((Person) e2.getValue()).getPersonName())); System.out.println(“按名字顺序排列”); for (Entry<String, Person> entry : entries) { System.out.println(entry.getValue()); }    

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/52224.html

(0)
上一篇 2024年 9月 2日
下一篇 2024年 9月 2日

相关推荐

关注微信