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

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

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

前言

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

java 比較器概述

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

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

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

自然排序 Comparable

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

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

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

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

案例一:對(duì)字符串?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接口,并對(duì)compareTo方法進(jìn)行了重寫(xiě)!

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

此時(shí)我們要將這個(gè)對(duì)象實(shí)現(xiàn)Comparable接口,然后重寫(xiě)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;
    }
    //重寫(xiě)compareTo
    @Override
    public int compareTo(Object o) {
        //按照?qǐng)D書(shū)價(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ù)類型不一致!");
    }
    //重寫(xiě) toString
    @Override
    public String toString() {
        return "Books{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

這樣寫(xiě)是從小到大排,如果要從大到小排,則需要將return值反過(guò)來(lái)!

定制排序 Comparator

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

2.重寫(xiě) 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 來(lái)控制某些數(shù)據(jù)結(jié)構(gòu)(如有序 set 或有序映射)的順序,或者為那些沒(méi)有自然順序的對(duì)象 colection 提供排序。

案例:對(duì)自定義對(duì)象進(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;
    }
    //重寫(xiě) toString
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

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

Comparable 與 Comparator 的使用對(duì)比

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

到此這篇關(guān)于Java常用類之比較器的使用詳解的文章就介紹到這了,更多相關(guān)Java比較器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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)者模式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 如何使用IntelliJ IDEA中的Live Templates自定義代碼模板

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

    在IntelliJ IDEA中,通過(guò)使用LiveTemplates功能,可以實(shí)現(xiàn)快速編碼和自定義代碼模板,例如,輸入“main”可以自動(dòng)補(bǔ)全主函數(shù)結(jié)構(gòu),“sout”可以補(bǔ)全輸出語(yǔ)句,用戶可以通過(guò)設(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ù)的問(wèn)題

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

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

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

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

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

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

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

    本文主要介紹了idea中如何過(guò)濾某些文件不提交,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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

最新評(píng)論

深州市| 波密县| 汾西县| 临城县| 信阳市| 华阴市| 内江市| 耒阳市| 普格县| 同心县| 大埔县| 孟津县| 利辛县| 武义县| 津南区| 文化| 平定县| 武川县| 札达县| 黄石市| 平乐县| 突泉县| 大新县| 枣庄市| 勃利县| 阿拉善左旗| 灵武市| 抚州市| 林甸县| 阿拉尔市| 桂东县| 诏安县| 时尚| 淮阳县| 泾源县| 阳城县| 安庆市| 中山市| 临夏市| 云浮市| 年辖:市辖区|