java中的compareto方法的详细介绍

java中的compareto方法的详细介绍java中的compareto方法的详细介绍JavaComparator接口实例讲解(抽象方法、常用静态/默认方法)一.java中的compareto方法1.返回参与比较的前后两个字符串的as

大家好,又见面了,我是你们的朋友全栈君。

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());
            
        }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154393.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • acwing-393. 雇佣收银员(差分约束)

    acwing-393. 雇佣收银员(差分约束)一家超市要每天 24 小时营业,为了满足营业需求,需要雇佣一大批收银员。已知不同时间段需要的收银员数量不同,为了能够雇佣尽可能少的人员,从而减少成本,这家超市的经理请你来帮忙出谋划策。经理为你提供了一个各个时间段收银员最小需求数量的清单 R(0),R(1),R(2),…,R(23)。R(0) 表示午夜 00:00 到凌晨 01:00 的最小需求数量,R(1) 表示凌晨 01:00 到凌晨 02:00 的最小需求数量,以此类推。一共有 N 个合格的申请人申请岗位,第 i 个申请人可以从 ti 时刻开始

    2022年8月9日
    11
  • java文档注释报错,java文档注释主要使用方法「建议收藏」

    java文档注释报错,java文档注释主要使用方法「建议收藏」一、java包含哪些注释1.//用于单行注释。2./*…*/用于多行注释,从/*开始,到*/结束,不能嵌套。3./**…*/则是为支持jdk工具javadoc.exe而特有的注释语句。这个也就是我们所知的文档注释在命名控制台:使用命令行在目标文件所在目录输入javadoc+文件名.java。二、文档注释的关键名词/**标记用于…

    2025年6月17日
    3
  • matlab fmincon函数格式,求助 fmincon 函数调用格式说明

    matlab fmincon函数格式,求助 fmincon 函数调用格式说明functionKineticsEstclearallclck0=[0.50.50.50.50.5];%参数初值lb=[00000];%参数下限ub=[+inf+inf+inf+inf+inf];%参数上限x0=[0.18830.25070.0467…

    2022年5月10日
    34
  • 沟通和认同:自我的塑造与展现

    沟通和认同:自我的塑造与展现一、沟通和自我1、自我概念:指对自己所持有的相对稳定的知觉2、自尊:对自我价值的评估3、反映评价:我们每个人得出的自我概念反映的是我们认为别人看待我们的方式4、社会比较:依据与他人对照的方式评估自身5、自我概念是被周遭环境塑造出来的,塑造的过程以两种方式呈现:反映评价和社会比较6、自我概念的特征:6.1、自我概念是主观的(有些人长期乃至永久地经受着过度的自我怀疑和批判之苦)(当我们经历负面情绪的时候要比我们心情好时对自己更挑剔)6.2、自我概念抗拒改变7、接受一个

    2022年6月25日
    32
  • vector 的六种 创建和初始化方法「建议收藏」

    vector 的六种 创建和初始化方法「建议收藏」C++的初始化方法很多,各种初始化方法有一些不同。(1):vector&lt;int&gt;ilist1;  默认初始化,vector为空,size为0,表明容器中没有元素,而且capacity也返回0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。(2):vector&lt;int&gt;ilist2(ilist);vector&lt…

    2026年1月18日
    3
  • 泰安北大青鸟 Java培训_泰山区岱岳javaEE开发职业学校_java编程「建议收藏」

    泰安北大青鸟 Java培训_泰山区岱岳javaEE开发职业学校_java编程「建议收藏」泰安北大青鸟为您导航泰山区岱岳javaEE开发职业学校,java编程,欢迎来电!泰安北大青鸟泰山区岱岳javaEE开发职业学校,环境变量规范的说是操作系统中运来指定操作系统运行环境的一些参数,当要求系统运行一个程序而没有告诉程序的完整路径时,泰安JA编程培训系统除了在当前下面寻找此程序外,还应道path中指定的路径去找,泰安JA开发培训这就是环境变量的作用。什么是jdk环境变量配置?由于C++所具…

    2022年7月8日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号