2011-09-05 60 views
4

考慮一個由枚舉類型組成的集合。是否有一些圖書館方法min(或max)接受此集合(或可變參數)並返回最小值/最大值?Java標準庫中是否有一些方法可以從一組枚舉中獲得最小的枚舉?

編輯:我的意思是枚舉的自然順序,如其compare執行Comparable的定義。

+4

你最小的價值與小序號? – 2011-09-05 20:49:14

+0

你如何定義「最小」?你的枚舉是否使用比較器? –

+0

@soc,當你說最小/最高時,你認爲什麼樣的順序? 1)自然排序是常數被聲明的順序? 2)常量的字母順序? – bpgergo

回答

6

枚舉實現Comparable<E>(其中E is Enum<E>)及其自然順序是枚舉常量聲明的順序。 您可以使用它們的默認可比實現以獲得最大和最小常量聲明:

public enum BigCountries { 
    USA(312), INDIA(1210), CHINA(1330), BRAZIL (190); 

    private int population; 

    private BigCountries(int population) { 
     this.population = population; 
    } 

} 

然後你可以使用:

BigCountries first = Collections.min(Arrays.asList(BigCountries.values())); // USA 
BigCountries last = Collections.max(Arrays.asList(BigCountries.values())); //BRAZIL 

或許,更快的方法是使用直接訪問由values()方法返回數組:

BigCountries[] values = BigCountries.values(); 
System.out.println(values[0]); // USA; 
System.out.println(values[values.length-1]); // BRAZIL; 

注意給予枚舉的參數在排序沒有影響。

1

如果你想自定義排序(比如按字母順序排列),如果你想保留聲明的順序使用任何收集

class MyComparator implements Comparator<MyEnumType> 
{ 
    public int compare(MyEnumType enum1, MyEnumType enum2) 
    { 
     return o1.toString().compareTo(o1.toString()); 
    } 
} 

自定義比較,把它們放入一個SortedSet的

SortedSet<MyEnumType> set = new TreeSet<MyEnumType>(); 
set.add(enum1); 
2

如果您有一些Set<MyEnum>,它應該已經是EnumSet類型。不幸的是,這個類沒有提供firstlast方法,但它確實保證按遞增順序進行迭代,因此您可以可靠地使用例如thatSet.toArray()中的第一個和最後一個元素。