2011-09-05 78 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()中的第一个和最后一个元素。