欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的比較器詳細解析

 更新時間:2023年11月29日 10:07:25   作者:時代&信念  
這篇文章主要介紹了Java中的比較器詳細解析,基本數(shù)據(jù)類型的數(shù)據(jù)(除boolean類型外)需要比較大小的話,直接使用比較運算符即可,但是引用數(shù)據(jù)類型是不能直接使用比較運算符來比較大小的,需要的朋友可以參考下

引入的背景

我們知道基本數(shù)據(jù)類型的數(shù)據(jù)(除boolean類型外)需要比較大小的話,直接使用比較運算符即可,但是引用數(shù)據(jù)類型是不能直接使用比較運算符來比較大小的。那么,如何解決這個問題呢?

在Java中經(jīng)常會涉及到對象數(shù)組的排序問題,那么就涉及到對象之間的比較問題。 Java實現(xiàn)對象排序的方式有兩種:

  • 自然排序:java.lang.Comparable
  • 定制排序:java.util.Comparator

自然排序:java.lang.Comparable

Comparable接口強行對實現(xiàn)它的每個類的對象進行整體排序。這種排序被稱為類的自然排序。

實現(xiàn) Comparable 的類必須實現(xiàn) compareTo(Object obj) 方法,兩個對象即通過 compareTo(Object obj) 方法的返回值來比較大小。

  • 如果當前對象this大于形參對象obj,則返回正整數(shù)。
  • 如果當前對象this小于形參對象obj,則返回負整數(shù)。
  • 如果當前對象this等于形參對象obj,則返回零。
package java.lang;

public interface Comparable{
    int compareTo(Object obj);
}

Comparable 的典型實現(xiàn):(默認都是從小到大排列的)

  • String:按照字符串中字符的Unicode值進行比較
  • Character:按照字符的Unicode值來進行比較
  • 數(shù)值類型對應的包裝類以及BigInteger、BigDecimal:按照它們對應的數(shù)值大小進行比較
  • Boolean:true 對應的包裝類實例大于 false 對應的包裝類實例
  • Date、Time等:后面的日期時間比前面的日期時間大

測試String

代碼示例:

 @Test
    public void test1(){
        //測試String已經(jīng)寫好的
        String [] a = new String[]{"Jack", "Tom", "Lucy"};

        //排序之前
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+"\t");
        }

        System.out.println();
        //使用Arrays進行排序
        Arrays.sort(a);

        //排序之后進行展示
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+"\t");
        }
    }

運行效果:

在這里插入圖片描述

測試自己實現(xiàn)comparable接口

Product類

package cn.edu.chd.exer1;

import java.util.Objects;


public class Product implements Comparable{
    private String name;
    private double prices;

    //無參構造
    public Product() {
    }

    //全參構造
    public Product(String name, double prices) {
        this.name = name;
        this.prices = prices;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrices() {
        return prices;
    }

    public void setPrices(double prices) {
        this.prices = prices;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", prices=" + prices +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return Double.compare(product.prices, prices) == 0 && name.equals(product.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, prices);
    }

    @Override
    public int compareTo(Object o) {
        //如果是同一個對象,return 0
        if (this == o){
            return 0;
        }

        //兩個對象比較的標準是:價格從小到大,價格一樣的話,按照名字從小到大
        if (o instanceof Product){
            Product p = (Product)o;
            int v = Double.compare(this.prices, p.prices);
//            return v;
            if (v != 0){
                return v;
            }
            //價格如果相同,名字按照從小到大
            return this.name.compareTo(p.name);
        }
        //手動拋異常
        throw new RuntimeException("類型不匹配");

    }
}

測試

    //對不同對象的大小進行排序
    @Test
    public void test2(){

        //商品數(shù)組
        Product[] products = new Product[5];
        //全參構造器,在new對象時就對屬性進行賦值
        products[0] = new Product("Huawei", 5999);
        products[1] = new Product("XiaoMi", 4999);
        products[2] = new Product("iPhone", 9999);
        products[3] = new Product("vivo", 3999);
        products[4] = new Product("Honer", 5999);


        System.out.println("排序之前");
        //排序之前的遍歷
        for (int i = 0; i < products.length; i++) {
            System.out.println(products[i]);
        }

        System.out.println("----------------------------------------------");
        //使用arrays進行排序
        Arrays.sort(products);

        System.out.println("排序之后");
        //排序后的遍歷
        for (int i = 0; i < products.length; i++) {
            System.out.println(products[i]);
        }
        
    }

運行效果

在這里插入圖片描述

定制排序:java.util.Comparator

思考

  • 當元素的類型沒有實現(xiàn)java.lang.Comparable接口而又不方便修改代碼(例如:一些第三方的類,你只有.class文件,沒有源文件)
  • 如果一個類,實現(xiàn)了Comparable接口,也指定了兩個對象的比較大小的規(guī)則,但是此時此刻我不想按照它預定義的方法比較大小,但是我又不能隨意修改,因為會影響其他地方的使用,怎么辦?(例如:我想要String按照字母從大到小的順序排序,而不是默認的從小到大)

JDK在設計類庫之初,也考慮到這種情況,所以又增加了一個java.util.Comparator接口。強行對多個對象進行整體排序的比較。

  • 重寫compare(Object o1,Object o2)方法,比較o1和o2的大小:如果方法返回正整數(shù),則表示o1大于o2;如果返回0,表示相等;返回負整數(shù),表示o1小于o2。
  • 可以將 Comparator 傳遞給 sort 方法(如 Collections.sort 或 Arrays.sort),從而允許在排序順序上實現(xiàn)精確控制。

Product類

package cn.edu.chd.exer2;

import java.util.Objects;


public class Product implements Comparable{
    private String name;
    private double prices;

    //無參構造
    public Product() {
    }

    //全參構造
    public Product(String name, double prices) {
        this.name = name;
        this.prices = prices;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrices() {
        return prices;
    }

    public void setPrices(double prices) {
        this.prices = prices;
    }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", prices=" + prices +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return Double.compare(product.prices, prices) == 0 && name.equals(product.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, prices);
    }

    @Override
    public int compareTo(Object o) {
        //如果是同一個對象,return 0
        if (this == o){
            return 0;
        }

        //兩個對象比較的標準是:價格從小到大,價格一樣的話,按照名字從小到大
        if (o instanceof Product){
            Product p = (Product)o;
            int v = Double.compare(this.prices, p.prices);
//            return v;
            if (v != 0){
                return v;
            }
            //價格如果相同,名字按照從小到大
            return this.name.compareTo(p.name);
        }
        //手動拋異常
        throw new RuntimeException("類型不匹配");

    }
}

按照商品的價格從低到高排序的comparator

 @Test
    public void test1(){
        //new一個comparator接口的匿名實現(xiàn)類
        Comparator comparator = new Comparator() {
            //按照商品的價格從低到高排序
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 == o2){
                    return 0;
                }
                if (o1 instanceof Product && o2 instanceof Product){
                    //強轉
                    Product p1 = (Product) o1;
                    Product p2 = (Product) o2;
                    return Double.compare(p1.getPrices(), p2.getPrices());

                }
                throw new RuntimeException("類型不匹配");

            }
        };

        //商品數(shù)組
        Product[] products = new Product[5];
        //全參構造器,在new對象時就對屬性進行賦值
        products[0] = new Product("Huawei", 5999);
        products[1] = new Product("XiaoMi", 4999);
        products[2] = new Product("iPhone", 9999);
        products[3] = new Product("vivo", 3999);
        products[4] = new Product("Honer", 5999);


        System.out.println("排序之前");
        //排序之前的遍歷
        for (int i = 0; i < products.length; i++) {
            System.out.println(products[i]);
        }

        System.out.println("----------------------------------------------");
        //將comparator對象作為參數(shù)進行傳入,排序
        Arrays.sort(products, comparator);

        System.out.println("排序之后");
        //排序后的遍歷
        for (int i = 0; i < products.length; i++) {
            System.out.println(products[i]);
        }



        
    }

運行效果:

在這里插入圖片描述

按照名稱進行排序的comparator

   //按照名稱進行排序
    @Test
    public void test2(){
        //new一個comparator接口的匿名實現(xiàn)類
        Comparator comparator = new Comparator() {
            //按照商品的名稱進行排序
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 == o2){
                    return 0;
                }
                if (o1 instanceof Product && o2 instanceof Product){
                    //強轉
                    Product p1 = (Product) o1;
                    Product p2 = (Product) o2;
                    return p1.getName().compareTo(p2.getName());

                }
                throw new RuntimeException("類型不匹配");

            }
        };

        //商品數(shù)組
        Product[] products = new Product[5];
        //全參構造器,在new對象時就對屬性進行賦值
        products[0] = new Product("Huawei", 5999);
        products[1] = new Product("XiaoMi", 4999);
        products[2] = new Product("iPhone", 9999);
        products[3] = new Product("vivo", 3999);
        products[4] = new Product("Honer", 5999);


        System.out.println("排序之前");
        //排序之前的遍歷
        for (int i = 0; i < products.length; i++) {
            System.out.println(products[i]);
        }

        System.out.println("----------------------------------------------");
        //將comparator對象作為參數(shù)進行傳入,排序
        Arrays.sort(products, comparator);

        System.out.println("排序之后");
        //排序后的遍歷
        for (int i = 0; i < products.length; i++) {
            System.out.println(products[i]);
        }


    }

運行效果:

在這里插入圖片描述

到此這篇關于Java中的比較器詳細解析的文章就介紹到這了,更多相關Java中的比較器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot如何優(yōu)雅的使用多線程實例詳解

    Spring Boot如何優(yōu)雅的使用多線程實例詳解

    這篇文章主要給大家介紹了關于Spring Boot如何優(yōu)雅的使用多線程的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-05-05
  • RabbitMQ?延遲隊列實現(xiàn)訂單支付結果異步階梯性通知(實例代碼)

    RabbitMQ?延遲隊列實現(xiàn)訂單支付結果異步階梯性通知(實例代碼)

    這篇文章主要介紹了RabbitMQ?延遲隊列實現(xiàn)訂單支付結果異步階梯性通知,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • SpringBoot注入Bean的四種方式總結

    SpringBoot注入Bean的四種方式總結

    這篇文章主要給大家總結SpringBoot注入Bean的四種方式,啟動類注入Bean,啟動類掃描@ComponentScan,啟動類@EnableConfigurationProperties以及啟動類@Import這四種方式,文章通過代碼示例講解非常詳細,需要的朋友可以參考下
    2023-11-11
  • SpringData JPA實體映射與關系映射的實現(xiàn)

    SpringData JPA實體映射與關系映射的實現(xiàn)

    Spring Data JPA作為Spring生態(tài)系統(tǒng)中的核心項目,通過JPA規(guī)范提供了優(yōu)雅而強大的實體映射與關系處理機制,下面就來介紹一下,感興趣的可以了解一下
    2025-04-04
  • Spring Boot四大神器之CLI的具體使用

    Spring Boot四大神器之CLI的具體使用

    本文主要介紹了Spring Boot四大神器之CLI的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • swagger的請求參數(shù)不顯示,@Apimodel的坑點及解決

    swagger的請求參數(shù)不顯示,@Apimodel的坑點及解決

    這篇文章主要介紹了swagger的請求參數(shù)不顯示,@Apimodel的坑點及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java8中Lambda表達式使用和Stream API詳解

    Java8中Lambda表達式使用和Stream API詳解

    這篇文章主要給大家介紹了關于Java8中Lambda表達式使用和Stream API的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java8具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Java用for循環(huán)Map詳細解析

    Java用for循環(huán)Map詳細解析

    本篇文章主要介紹了Java用for循環(huán)Map,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • 學習SpringMVC——如何獲取請求參數(shù)詳解

    學習SpringMVC——如何獲取請求參數(shù)詳解

    本篇文章主要介紹了SpringMVC——如何獲取請求參數(shù)詳解,詳細的介紹了每種參數(shù)注解的用法。具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • spring?boot中spring框架的版本升級圖文教程

    spring?boot中spring框架的版本升級圖文教程

    Spring Boot是一款基于Spring框架的快速開發(fā)框架,它提供了一系列的開箱即用的功能和組件,這篇文章主要給大家介紹了關于spring?boot中spring框架的版本升級的相關資料,需要的朋友可以參考下
    2023-10-10

最新評論