最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java常用類之比較器的使用詳解

 更新時(shí)間:2022年11月22日 08:56:40   作者:館主阿牛  
這篇文章主要為大家詳細(xì)介紹了Java中比較器的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

前言

Java 中的對象,正常情況下,只能進(jìn)行 = 或 != 比較。不能使用 > 或 < 的比較,但是在開發(fā)場景中,我們需要對多個(gè)對象進(jìn)行排序,這就需要比較對象的大小。此時(shí)我們?nèi)绾螌?shí)現(xiàn)呢?java為我們提供了兩個(gè)接口,使用兩個(gè)接口中的任何一個(gè): Comparable 或 Comparator 即可實(shí)現(xiàn)對象的比較大??!

java 比較器概述

在 Java 中經(jīng)常會(huì)涉及到對象數(shù)組的排序問題,那么就涉及到對象之間的比較問題。

Java 實(shí)現(xiàn)對象排序的方式有兩種:

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

自然排序 Comparable

1.Comparable 接口強(qiáng)行對實(shí)現(xiàn)它的每個(gè)類的對象進(jìn)行整體排序。這種排序被稱為類的自然排序。

2.實(shí)現(xiàn) Comparable 的類必須實(shí)現(xiàn) compareTo (Object obj)方法,兩個(gè)對象即通過 compareTo (Object obj)方法的返回值來比較大小。如果當(dāng)前對象 this 大于形參對象 obj ,則返回正整數(shù),如果當(dāng)前對象 this 小于形參對象 obj ,則返回負(fù)整數(shù),如果當(dāng)前對象 this 等于形參對象 obj ,則返回零。

3.實(shí)現(xiàn) Comparable 接口的對象數(shù)組可以通過 Collections.sort 或Arrays.sort 進(jìn)行自動(dòng)排序。實(shí)現(xiàn)此接口的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。

注:像 String 、包裝類等實(shí)現(xiàn)了 Comparable 接口,重寫了 compareTo(obj) 方法,進(jìn)行了從小到大的排列!

案例一:對字符串?dāng)?shù)組進(jìn)行排序

import java.util.Arrays;

public class ComparableTest {
    public static void main(String[] args) {
        String[] arr = new String[]{"aniu","tom","tony","lisa"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

這是因?yàn)槲覀兊腟tring實(shí)現(xiàn)了Comparable接口,并對compareTo方法進(jìn)行了重寫!

案例二:對自定義對象進(jìn)行排序

此時(shí)我們要將這個(gè)對象實(shí)現(xiàn)Comparable接口,然后重寫compareTo方法。

package 比較器;

import java.util.Arrays;

public class ComparableDemo {
    public static void main(String[] args) {
        Books[] book = new Books[4];
        book[0] = new Books("The Beautiful and the Damned",68);
        book[1] = new Books("Where Angels Fear to Tread",45);
        book[2] = new Books("These Lovers Fled Away",35);
        book[3] = new Books("The Left Hand of Darkness",58);

        Arrays.sort(book);
        for(Books item:book){
            System.out.println(item.toString());
        }
        //System.out.println(Arrays.toString(book));
    }
}

class Books implements Comparable{
    String name;
    double price;
    public Books(String name, double price) {
        this.name = name;
        this.price = price;
    }
    //重寫compareTo
    @Override
    public int compareTo(Object o) {
        //按照圖書價(jià)格從小到大排序
        if (o instanceof Books){
            Books b = (Books) o;
            if(this.price>b.price){
                return 1;
            }else if(this.price<b.price) {
                return -1;
            }else{
                return 0;
            }
        }
        throw new RuntimeException("傳入的數(shù)據(jù)類型不一致!");
    }
    //重寫 toString
    @Override
    public String toString() {
        return "Books{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

這樣寫是從小到大排,如果要從大到小排,則需要將return值反過來!

定制排序 Comparator

1.當(dāng)元素的類型沒有實(shí)現(xiàn) java.lang.Comparable 接口而又不方便修改代碼,或者實(shí)現(xiàn)了 java.lang.Comparable 接口的排序規(guī)則不適合當(dāng)前的操作,那么可以考慮使用 Comparator 的對象來排序,強(qiáng)行對多個(gè)對象進(jìn)行整體排序的比較。

2.重寫 compare(Object o1,Object o2) 方法,比較o1和o2的大小:如果方法返回正整數(shù),則表示o1大于o2;如果返回0,表示相等;返回負(fù)整數(shù),表示
o1小于o2。

3.可以將 Comparator 傳遞給 sort 方法(如 Collections.sort 或 Arrays.sort ),從而允許在排序順序上實(shí)現(xiàn)精確控制。

4.還可以使用 Comparator 來控制某些數(shù)據(jù)結(jié)構(gòu)(如有序 set 或有序映射)的順序,或者為那些沒有自然順序的對象 colection 提供排序。

案例:對自定義對象進(jìn)行排序

package 比較器;

import java.util.Arrays;
import java.util.Comparator;

public class ComparatorDemo {
    public static void main(String[] args) {
        Book[] book = new Book[4];
        book[0] = new Book("The Beautiful and the Damned",68);
        book[1] = new Book("Where Angels Fear to Tread",45);
        book[2] = new Book("These Lovers Fled Away",35);
        book[3] = new Book("The Left Hand of Darkness",58);

        Arrays.sort(book, new Comparator(){
            //按照價(jià)格從大到小排
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof Book && o2 instanceof Book){
                    Book b1 = (Book)o1;
                    Book b2 = (Book)o2;
                    return -Double.compare(b1.price,b2.price); //這里我們直接調(diào)用Double的compare方法
                }
                throw new RuntimeException("傳入的數(shù)據(jù)類型不一致!");
            }
        });
        for(Book item:book){
            System.out.println(item.toString());
        }
        //System.out.println(Arrays.toString(book));
    }
}

class Book{
    String name;
    double price;
    public Book(String name, double price) {
        this.name = name;
        this.price = price;
    }
    //重寫 toString
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

可以從代碼看到,這里這里我們直接調(diào)用Double的compare方法進(jìn)行了比較,不用像上面的案例一樣手寫了,當(dāng)然我們也可以用comparTo方法,因?yàn)樯厦嫣岬搅?,包裝類也實(shí)現(xiàn)了Comparable接口,但Double重寫的comparTo方法底層依舊是compare方法!因?yàn)槭菑拇蟮叫∨?,所以在Double前加個(gè)負(fù)號!

Comparable 與 Comparator 的使用對比

Comparable 接口的方式一旦一定,保證 Comparable 接口實(shí)現(xiàn)類的對象在任何位置都可以比較大小 ,而 Comparator 接口屬于臨時(shí)性的比較。
再者一個(gè)很直觀的是Comparable是在自定義類中將比較規(guī)則在類中寫死了的,而Comparator則比較靈活,在比較時(shí)定義比較規(guī)則,看起來靈活一點(diǎn)!

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

相關(guān)文章

  • 實(shí)現(xiàn)分布式WebSocket集群的方法

    實(shí)現(xiàn)分布式WebSocket集群的方法

    本文總結(jié)出了幾個(gè)實(shí)現(xiàn)分布式WebSocket集群的辦法,從zuul到spring cloud gateway的不同嘗試,總結(jié)出了這篇文章,希望能幫助到某些人,并且能一起分享這方面的想法與研究
    2022-03-03
  • Java 多個(gè)異常共享同一個(gè)異常處理器的方法

    Java 多個(gè)異常共享同一個(gè)異常處理器的方法

    這篇文章主要介紹了Java 多個(gè)異常共享同一個(gè)異常處理器的方法,Java 的異常處理機(jī)制,在 Java 7 中有了非常大的改進(jìn)。其中一個(gè)特性就是,支持多個(gè)異常共享同一個(gè)異常處理器。,需要的朋友可以參考下
    2019-06-06
  • Java多種方式實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式

    Java多種方式實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式

    這篇文章主要介紹了Java多種方式實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 如何使用IntelliJ IDEA中的Live Templates自定義代碼模板

    如何使用IntelliJ IDEA中的Live Templates自定義代碼模板

    在IntelliJ IDEA中,通過使用LiveTemplates功能,可以實(shí)現(xiàn)快速編碼和自定義代碼模板,例如,輸入“main”可以自動(dòng)補(bǔ)全主函數(shù)結(jié)構(gòu),“sout”可以補(bǔ)全輸出語句,用戶可以通過設(shè)置中的LiveTemplates選項(xiàng)查看和定義快捷模板,支持使用分組管理和參數(shù)化模板內(nèi)容,適應(yīng)復(fù)雜的編碼需求
    2024-11-11
  • Java正則表達(dá)式之split()方法實(shí)例詳解

    Java正則表達(dá)式之split()方法實(shí)例詳解

    這篇文章主要介紹了Java正則表達(dá)式之split()方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了split方法的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-03-03
  • Jersey Restful接口如何獲取參數(shù)的問題

    Jersey Restful接口如何獲取參數(shù)的問題

    這篇文章主要介紹了Jersey Restful接口如何獲取參數(shù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java springmvc 注冊中央調(diào)度器代碼解析

    java springmvc 注冊中央調(diào)度器代碼解析

    這篇文章主要介紹了java springmvc 注冊中央調(diào)度器代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 關(guān)于Lombok簡化編碼使用及說明

    關(guān)于Lombok簡化編碼使用及說明

    這篇文章主要介紹了關(guān)于Lombok簡化編碼使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • idea中如何過濾某些文件不提交的方法實(shí)現(xiàn)

    idea中如何過濾某些文件不提交的方法實(shí)現(xiàn)

    本文主要介紹了idea中如何過濾某些文件不提交,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java匿名類,匿名內(nèi)部類實(shí)例分析

    Java匿名類,匿名內(nèi)部類實(shí)例分析

    這篇文章主要介紹了Java匿名類,匿名內(nèi)部類,結(jié)合實(shí)例形式分析了Java匿名類,匿名內(nèi)部類相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04

最新評論

绵阳市| 定南县| 佛冈县| 嘉黎县| 永年县| 和平区| 汾阳市| 台南市| 澎湖县| 昆明市| 百色市| 汝州市| 宁阳县| 鸡东县| 扎鲁特旗| 和林格尔县| 怀宁县| 柏乡县| 景东| 红原县| 大足县| 瓦房店市| 辛集市| 日土县| 新和县| 宝兴县| 磐石市| 铜梁县| 晋城| 斗六市| 吉安县| 清河县| 平邑县| 汉中市| 将乐县| 志丹县| 尚义县| 潢川县| 鹤庆县| 前郭尔| 上饶市|