最大最小值及比較器
一、獲取集合中的最大最小值的方法
方法一:對於已經實現了比較器的基礎類(如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也能用
最大最小值及比較器