在Java标准库中是否有一种方法可以从一组枚举中获取最小的枚举值?

4
考虑一个包含枚举类型的集合。是否存在一些库方法min(或max),该方法接受此集合(或可变参数)并返回最小/最大值?
编辑:我指的是枚举的自然顺序,由它们Comparablecompare实现定义。

4
您是指在小型序列中寻找最小值吗? - user180100
你如何定义“最小”?你的枚举使用比较器吗? - Hovercraft Full Of Eels
@soc,当你说最小/最高时,你想到的是哪种排序方式?1)自然排序是按照常量声明的顺序排列吗?2)按常量的字母顺序排列? - bpgergo
2
公共枚举星球 { 水星,[... ] ,地球 } 对于你来说,最小的枚举是什么? 如果最小值对你有意义,则应考虑向枚举添加字段。 你的程序不应该依赖于枚举声明的顺序。 - Jean Logeart
3个回答

6

枚举实现了 Comparable<E> 接口(其中 EEnum<E>),它们的自然顺序是声明枚举常量的顺序。您可以使用它们默认的 Comparable 实现来获取已声明的最大和最小常量:

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;

请注意,枚举中给定的参数对排序没有影响。

2
如果您有一些Set<MyEnum>,它应该已经是EnumSet类型。不幸的是,这个类没有提供firstlast方法,但它确保按递增顺序迭代,所以您可以可靠地使用thatSet.toArray()中的第一个和最后一个元素。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接