将int与枚举匹配的优雅方式,其中每个枚举类型对应于一个范围

时间:2010-01-26 07:47:12

标签: java enums

我试图想出一种在Java中解决这个问题的优雅方法:

给定0-100的int是一种优雅的方法,将其转换为枚举,其中每个枚举的可能值对应于一系列整数。

例如

enum grades{

    A -> 90-95%
    B -> 85-90%,
    C -> 75-85%
    ...
    etc

}

任何人都可以想到一种简洁的方法来编写一个方法,给定一个int返回一个成绩枚举或抛出一个IllegalArgumentException?

3 个答案:

答案 0 :(得分:4)

编写一个静态方法,就像valueOf()已经存在一样,称之为inRange(),返回Grade

public enum Grade {
    A(100, 90), B(89, 80), C(79, 70);

    int uBound;
    int lBound;

    Grade(int uBound, int lBound){
      ...
    }

    public static Grade inRange(int percent){
      ...
    }
}

更好地初始化静态map,将百分比初始化为键,将等级作为值。我建议你在这种情况下使用apache commons collection MapUtils。以下是一个例子,

private static final Map<Integer, Grade> GRADE_MAP = UnmodifiableMap.decorate(
        MapUtils.putAll(new HashMap<Integer, Grade>(), new Object[][]{
            {0, F}, {1, F}, .....,
            .....
            .....
            {100, A}
        }));

然后你的方法将如下所示,

    public static Grade inRange(int percent){
      return GRADE_MAP.get(percent);
    }

答案 1 :(得分:1)

我将边界作为枚举的属性,并实现方法

public boolean isInRange(int i)
枚举中的

,使用枚举的边界和边界与下一个较低的序号。

最后在枚举上实现一个静态方法,迭代实例以找到匹配的实例。

答案 2 :(得分:1)

提前创建索引为0..100的数组,并将每个插槽分配给您希望它对应的值。

然后在实际循环中查看数组中的值。

相关问题