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

发布于 2024-08-18 19:22:14 字数 301 浏览 3 评论 0原文

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

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

例如,

enum grades{

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

}

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

I am trying to think of an elegant way to solve this problem in Java:

Given an int of 0-100 what is an elegant way to turn it into an enum where each of the enum's possible values correspond to a range of ints.

For example

enum grades{

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

}

Can anybody think of a concise way to write a method that given an int returns an enum of grades or throws a IllegalArgumentException?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

2024-08-25 19:22:14

编写一个静态方法,就像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){
      ...
    }
}

更好地初始化静态地图,百分比作为键,等级作为值。在这种情况下,我建议您使用 apache commons 集合的 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);
    }

Write a static method, just like valueOf() is already there, call it say inRange(), return 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){
      ...
    }
}

Better initialize a static map, percent as keys and Grade as values. I suggest you to use apache commons collection's MapUtils in this case. Below is an example,

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

then your method will look like below,

    public static Grade inRange(int percent){
      return GRADE_MAP.get(percent);
    }
素手挽清风 2024-08-25 19:22:14

我将使边界成为枚举的属性,并

public boolean isInRange(int i)

使用边界和具有下一个较低序数的枚举边界在枚举中实现一个方法。

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

I'd make the boundaries an attribute of the enum, and implement a method

public boolean isInRange(int i)

in the enum, using the boundary and the boundary of the enum with the next lower ordinal number.

Finally implement a static method on the enum, that iterates through the instances to find the matching instance.

独自唱情﹋歌 2024-08-25 19:22:14

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

然后在实际循环中只需在数组中查找值即可。

Ahead of time create an array with index 0..100 and assign each slot to the value you want it to correspond to.

Then in the actual loop just look the value up in the array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文