• 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.数字类型不能用compareTontint的比较不能用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接口,然后调用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<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());
                
            }
  • 相关阅读:
    一个Windows的对话框
    怎样用Javascript定义一个类
    WPF 开源UI框架
    企业级系统的认证与授权设计
    MVC (ModelBinder等)技巧
    oracle 调用存储过程和方法
    WPF相关文章索引 (持续更新中)
    当文件操作遇上进程占用时
    每位设计师都应该拥有的50个CSS代码片段
    wpf 复制/剪切到本地系统剪切板中以供右键粘贴用
  • 原文地址:https://www.cnblogs.com/lukelook/p/11101366.html
Copyright © 2020-2023  润新知