如何确定Java中枚举的最低/最高索引?

3
假设代码中有枚举声明:

Suppose there is the enum declaration somewhere in code:


假设代码中有一个枚举声明:
enum Colors { RED(100), BLUE(200); }

在不知道枚举类型声明的情况下,我能否获取该特定枚举类型的最低/最高索引值?在Java中是否可能?

例子:

int lowIndex = Colors.minIndex(); // should return 100

谢谢大家。所以没有隐式方法来查询定义的整数最小/最大值。我将不得不遍历枚举值并从中确定它,就像你们描述的那样。


2
“Index” 是指什么? - awksp
在声明中的 100 和 200。有没有一种方法可以查询枚举类型中声明的最小/最大整数值? - kerafill
1
哦,我一开始以为你在谈论数组索引...那些不是索引。那些是传递给构造函数的值;你发布的代码本身无法编译。你能否访问它们取决于枚举在内部的结构如何设计。 - awksp
@user3580294 我明白了。那些值是传递给构造函数的。那么,有没有隐式方法可以获取定义的最低/最高整数值呢? - kerafill
不,就像任何其他普通类别获取成员没有隐式方法一样。 - awksp
显示剩余4条评论
4个回答

3

您需要迭代枚举集合:

for (Color p : Color.values()) {
    // keep track of min "index"
}

记住枚举本质上是预定义对象实例的集合。 RED(100) 是在调用 Color(int value) 构造函数。话虽如此,我可以创建一个颜色枚举,其定义的值如下:

RED("best", 14, 3.33546)

因此,查找最小“索引”的逻辑将因情况而异。

我选择了你的帖子作为答案。它澄清了我正在处理的问题。尽管你和@SimonC有类似的回复,但这是第一个澄清问题的帖子。 - kerafill
太棒了,愉快的编程! - bstar55
好的,@bstar55 比我先完成了! - SimonC

2

您所说的索引是指枚举中的顺序值还是整数值?

无论如何,这是一个简单的示例,可能会帮助您:

enum Mobile {
   Samsung(400), Nokia(250),Motorola(325);

   int price;
   Mobile(int p) { //values in brackets are set to price property in enum
      price = p;
   }
   int showPrice() {
      return price;  //you have to declare methods in enum to return value, there is no predefined function like returnValue()
   } 
}

public class EnumDemo {

   public static void main(String args[]) {

     System.out.println("CellPhone List:");
     for(Mobile m : Mobile.values()) {
        System.out.println(m + " costs " + m.showPrice() + " dollars");
     }

     Mobile ret = Mobile.Samsung;
     System.out.println("The ordinal is = " + ret.ordinal());
     System.out.println("MobileName = " + ret.name());                      
   }
}

请注意,java.lang.Enum.ordinal() 方法返回枚举常量的序数(它在其枚举声明中的位置,其中初始常量分配为零序数)。
输出为:
CellPhone List:
Samsung costs 400 dollars
Nokia costs 250 dollars
Motorola costs 325 dollars
The ordinal is = 0
MobileName = Samsung

2
您无法覆盖枚举的'index'。这里发生的情况是,'Colors'枚举具有一个以'int'为参数的构造函数。构造函数的实现负责存储该值。您可以维护一个静态映射这些值的地图,由枚举构造函数更新,该地图可用于查询最小/最大值。或者,您可以每次查找所有枚举以寻找最小/最大值。
int max = Integer.MIN_VALUE;
for (Colors c in Colors.values())
  max = Math.max(c.getIndex(), max);

2

这个怎么样?在枚举被加载时“缓存”值。

public enum Color {

    RED(100),
    BLUE(200);

    public final int val;

    private Color(int val) {
        this.val = val;

        if (Dummy.maxColor == null || Dummy.maxColor.val < val) {
            Dummy.maxColor = this;
        }
    }

    // This seems to be needed because you can't access static fields in enum constructors
    private static class Dummy {
        private static Color maxColor = null;
    }

    public static Color getMaxColor() {
        return Dummy.maxColor;
    }

}

我只想知道一个枚举类型的最低/最高定义整数值,而不必实例化它。 - kerafill
@kerafill 枚举在类加载时立即实例化。 - David Ehrmann

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