java比較器,java內部比較器和外部比較器

本文目錄一覽:

Java集合TreeSet比較器問題?

排序算法要提供一個比較器,用來指明如何比較大小,這個比較器就是comparator接口,person1.getAge() – person2.getAge()與person2.getAge() – person1.getAge()比較的結果正好相反,所以排序的結果也正好相反

java里的Collections類中的靜態方法sort()是怎麼用比較器比較兩個對象?

compareto的確是返回一個(-1,0,1)的值。

pricecomparator

類的compare方法調用compareto,他的返回值也是(-1,0,1)中的一個。

collections.sort方法就是按照pricecomparator

類的compare方法來比較list的各個元素,進行排序。

collections.sort的源碼我沒有看過,不知道他具體使用什麼方法排序,不過排序算法就那麼幾類:選擇排序、插入排序、交換排序。估計是快速排序吧。

java中雙列集合鍵值存儲為什麼比較器中 num == 0 ? 1 : num; 打印結果,值全部為null?把1改為0後值就正常!

我這樣打印是可以出現1的 可能是你上面的邏輯錯了吧

int num = 0;

System.out.println(“” + (num == 0 ? 1 : num));

java中是不是有個方法能直接返回一個比較器的

java中每個方法的返回值,有且僅有一個,因為方法中一旦使用return語句返回返回值,整個方法就會結束,下面的語句也將不會執行。

java中如果想返回多個值的話,可以採用數組和集合進行存儲,然後返回集合或者數組即可。其中數組用來封裝基本數據類型的數據,集合用來封裝對象數據。可以根據返回值的實際類型來選擇容器。

JAVA。比較器 JAVA比較器裏面那個compare函數怎麼實現升序或降序排列啊,retur

想當於一個比較規則,每兩個一比較,如果返回正數則前者大,返回負數就後者大,直接return a-b就能實現,不需要用if else了

java中Comparable和Comparator兩種比較器的區別

Comparable和Comparator接口都是為了對類進行比較,眾所周知,諸如Integer,double等基本數據類型,java可以對他們進行比較,而對於類的比較,需要人工定義比較用到的字段比較邏輯。可以把Comparable理解為內部比較器,而Comparator是外部比較器,基本的寫法如下:

class Apple implements ComparableApple{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

//return Double.compare(this.getPrice(),o.getPrice());

if (Math.abs(this.price-o.price)0.001)

return 0;

else

return (o.price-this.price)0?1:-1;

}

@Override

public String toString() {

return “Apple{” +

“id=” + id +

“, price=” + price +

‘}’;

}

}

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else{

return (o1.price-o2.price)0?1:-1;

}

}

}

實現了Comparable接口的類需要實現compareTo()方法,傳入一個外部參數進行比對,實現了Comparator接口的方法需要實現compare()方法,對外部傳入的兩個類進行比較,從而讓外部方法在比較時調用。

兩者的區別是實現Comparator接口代碼更加靈活,可以定義某個類的多個比較器,從而在排序時根據實際場景自由調用,而Comparable接口實現後便不能改動。兩種接口的調用方式如下:

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else{

return (o1.price-o2.price)0?1:-1;

}

}

}

class DESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

if (Math.abs(o1.price-o2.price)0.001)

return 0;

else {

return (o1.price-o2.price)0?-1:1;

}

}

}

public static void main(String[] args) {

Apple apple1 = new Apple(1,4.8);

Apple apple2 = new Apple(2,5.9);

Apple apple3 = new Apple(3,8.5);

ListApple list = new ArrayListApple();

list.add(apple1);

list.add(apple3);

list.add(apple2);

System.out.println(“Comparable==========”);

System.out.printf(“this list of apples: %s\n”,list);

Collections.sort(list);

System.out.printf(“this list of apples: %s\n”,list);

System.out.println(“Comparator==========”);

System.out.printf(“this list of apples: %s\n”,list);

Collections.sort(list,new DESComparator());

System.out.printf(“this list of apples: %s\n”,list);

Collections.sort(list,new AESComparator());

System.out.printf(“this list of apples: %s\n”,list);

}

}

上述代碼存在的問題,不能在比較器中進行double類型的減法操作,因為對於值比較大的double,減法操作容易導致值的溢出,java7對每一種包裝類型的比較新增了compare()方法,改造後的代碼如下:

class Apple implements ComparableApple{

int id;

double price;

public Apple(int id, double price) {

this.id = id;

this.price = price;

}

public int compareTo(Apple o) {

return Double.compare(this.price,o.price);

}

@Override

public String toString() {

return “Apple{” +

“id=” + id +

“, price=” + price +

‘}’;

}

}

class AESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

return Double.compare(o1.price,o2.price);

}

}

class DESComparator implements ComparatorApple{

public int compare(Apple o1, Apple o2) {

return Double.compare(o2.price,o1.price);

}

}

查看Double.compare的源碼如下

public static int compare(double d1, double d2) {

if (d1 d2)

return -1; // Neither val is NaN, thisVal is smaller

if (d1 d2)

return 1; // Neither val is NaN, thisVal is larger

// Cannot use doubleToRawLongBits because of possibility of NaNs.

long thisBits = Double.doubleToLongBits(d1);

long anotherBits = Double.doubleToLongBits(d2);

return (thisBits == anotherBits ? 0 : // Values are equal

(thisBits anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)

1)); // (0.0, -0.0) or (NaN, !NaN)

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/249453.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:11
下一篇 2024-12-12 17:11

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論