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

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

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

前言

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

java 比較器概述

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

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

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

自然排序 Comparable

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

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

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

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

案例一:對字符串數(shù)組進行排序

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

這是因為我們的String實現(xiàn)了Comparable接口,并對compareTo方法進行了重寫!

案例二:對自定義對象進行排序

此時我們要將這個對象實現(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) {
        //按照圖書價格從小到大排序
        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.當元素的類型沒有實現(xiàn) java.lang.Comparable 接口而又不方便修改代碼,或者實現(xiàn)了 java.lang.Comparable 接口的排序規(guī)則不適合當前的操作,那么可以考慮使用 Comparator 的對象來排序,強行對多個對象進行整體排序的比較。

2.重寫 compare(Object o1,Object o2) 方法,比較o1和o2的大?。喝绻椒ǚ祷卣麛?shù),則表示o1大于o2;如果返回0,表示相等;返回負整數(shù),表示
o1小于o2。

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

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

案例:對自定義對象進行排序

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(){
            //按照價格從大到小排
            @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方法進行了比較,不用像上面的案例一樣手寫了,當然我們也可以用comparTo方法,因為上面提到了,包裝類也實現(xiàn)了Comparable接口,但Double重寫的comparTo方法底層依舊是compare方法!因為是從大到小排,所以在Double前加個負號!

Comparable 與 Comparator 的使用對比

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

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

相關文章

最新評論