1. 程式人生 > >最大最小值及比較器

最大最小值及比較器

寫法 color obj 核心 rto 正序 public imp ctc

一、獲取集合中的最大最小值的方法

方法一:對於已經實現了比較器的基礎類(如Integer/Date)可以用集合自帶的比較方法Collections.max(list)或者Collections.min(list)

方法二:主要應用於自定義類

代碼如下:

List<Interger> list = new ArrayList<Interger>();

int max = list.get(0);

int min = list.get(0);

for(int i=0;i<list.size();i++){

if(min>list.get(i)){

min=list.get(i);

}

if(max<list.get(i)){
max=list.get(i);

}

}

二、比較器(comparator和comparable)

1)Compartor接口是java.util包中的接口(工具包,包含集合類),而Comparable是java.lang包中的接口(核心基礎類)

在Compartor接口中包含兩個抽象方法,兩個方法分別是

1.1 compare(T o1, T o2)

1.2 equals(Object obj)

compare方法返回的是-1,0,1;分別對應於對象O1小於,等於,大於對象O2

equals方法返回的是一個布爾類型的

2)Comparable 接口中只有一個方法:compareTo(T o);

基本類型內部實現了compareTo方法,代碼如下:

public int compareTo(Integer anotherInteger) {
int thisVal = this.value;
int anotherVal = anotherInteger.value;
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}

小於、等於和大於分別對應的返回值為-1,0,和1

ps:(當正序排列時小於返回-1,放在左邊。如需進行倒序排列則重寫compareTo設定小於返回1,大於返回-1

3)什麽時候用Comparable,什麽時候用Compartor是通過繼承了該接口的實例對象對該方法進行調用

例如我們向容器中存放數據時,放java封裝好的對象,這時候的對象大多數都實現了comparable接口,而如果存放的是我們自己寫的類,我們需要對其進行封裝,並實現Comparable接口,這樣我們就可以使用容器的SORT方法。我們也可以不用實現Comparable接口,通過實現Compartor的類,然後再排序的時候調用即可

三、泛型(例:<T extends Comparable<? super T>>)

轉載1:來源zhihu

首先這是運用了java的泛型
extends後面跟的類型如<任意字符 extends 類/接口>表示泛型的上限
import java.util.*;
class Demo<T extends AbstractList>{}
public class Test
{
    public static void main(String[] args) {
	Demo<ArrayList> p = null; // 編譯正確
//這裏因為ArrayList是AbstractList的子類所以通過
//如果改為Demo<AbstractCollection> p = null;就會報錯這樣就限制了上限
    }
}

②同樣的super表示泛型的下限
③<T extends Comparable<? super T>>這裏來分析T表示任意字符名,extends對泛型上限進行了限制即T必須是Comparable<? super T>的子類,然後<? super T>表示Comparable<>中的類型下限為T!這樣來看一段代碼輔助理解
import java.util.GregorianCalendar;

class Demo<T extends Comparable<? super T>>{}

public class Test1
{
	public static void main(String[] args) {
	   Demo<GregorianCalendar> p = null; // 編譯正確
    }
}
這個可以理解為<GregorianCalendar extends Comparable<Calendar>>是可以運行成功的!因為Calendar為GregorianCalendar 的父類並且GregorianCalendar 實現了Comparable<Calendar>,可查看api!.
如果是如下代碼則運行不成功
import java.util.GregorianCalendar;
class Demo<T extends Comparable<T>>{}
//這裏把? super去掉了
public class Test
{
	public static void main(String[] args) {
	   Demo<GregorianCalendar> p = null; 
        }
}
編譯會報錯!因為<T extends Comparable<T>>相當於<GregorianCalendar extends Comparable<GregorianCalendar>>但是GregorianCalendar並沒有實現Comparable<GregorianCalendar>而是實現的Comparable<Calendar>,這裏不在限制範圍之內所以會報錯! 轉載2:來源zhihu Java的泛型寫法。泛型在java裏有兩個作用

a. type cheking at complie time

b. auto cast

所以根據a,他規定了T的類型。

第二、那麽T是什麽類型呢?

我們先簡化一下,看看下面這種寫法

<T extends Comparable<T>>

這個應該是比較常見的寫法,T 必須實現Comparable接口,而比較的類型T。

這很容易明白,因為T和T才能進行比較嘛。

問題來了,為什麽要使用以下寫法。

<T extends Comparable<? super T>>

但是 如果T的父類實現了 Comparable接口,而我們也想這個接口怎麽辦呢?看下面這個例子

class Dog implements Comparable<Dog>{
    int weight;
    public Dog(int weight) {
        this.weight = weight;
    }
    @Override
    public int compareTo(Dog o) {
        return this.weight - o.weight;
    }
}
class Labrador extends Dog{
    public Labrador(int weight) {
        super(weight);
    }
}

在這裏Labrador 繼承了Dog 和他的Comparable方法。

但如果泛型是<T extends Comparable <T>>

顯然 Labarador 是不符合的,因為他並沒有實現 Comprable<Labrador>。

如果改成<T extends Comparable<? super T>>,那麽只要Dog實現了Comparabl接口。Labrador也能用

最大最小值及比較器