Java枚举按数字范围搜索

标签 java enums

是否可以像下面这样枚举

enum {

 10  poor
 100  rich
 1000 very_rich


}

这样当我按输入值搜索时,比如说 101。它会返回“rich”?如何在枚举中做到这一点?可以举个例子吗?我不想用 forloop 循环整个枚举来获取 string_value。可能吗?

最佳答案

使用一个带有值的枚举,正如其他人已经建议的那样。

然后,不是通过枚举值执行暴力迭代搜索,而是提供静态lookup(int) 方法来执行 binary search通过所有值的有序列表/数组。

要执行搜索,从中值或中间值作为“根”开始,然后将我们要查找的值与该值进行比较。

如果我们正在寻找的值正是那个值,那么我们就完成了。如果小于该值,那么我们将开始搜索值的下半部分,再次从中间开始。如果更大,则与它后面的值进行比较,看看它是否在范围内。如果还大,则在上半部分搜索,以此类推。


编辑:根据要求编写代码示例。

public enum Wealth {

    BROKE(0),
    DESTITUTE(10),
    POOR(100),
    MIDDLE_CLASS(10000),
    RICH(100000),
    MILLIONAIRE(1000000),
    BILLIONAIRE(1000000000);

    private final int value;

    private Wealth(final int value) {
        this.value = value;
    }

    public final int getValue() {
        return value;
    }

    /**
     * @param v
     *        the value we're looking for
     * @return Wealth
     */
    public static Wealth lookup(final int v) {
        final Wealth[] a = Wealth.values();
        int min = 0;
        int max = a.length  - 1;
        int i;
        do {
            i = (min + max) / 2;
            final int av = a[i].value;
            if (v < av) {
                max = i;
            } else if (v > av) {
                if (i + 1 < a.length && v < a[i + 1].value) {
                    break;
                }
                min = i + 1;
            }
        } while (v != a[i].value && min < max);
        if (min == max) {
            return a[max];
        }
        return a[i];
    }

}

几点说明:

这假设 Wealth 的值已经排序。否则,快速排序(双关语!)应该可以解决问题。

这可能不是最有效的实现,只是从维基百科上的伪代码改编而来的快速而肮脏的实现。

如果您的值少于十几个,那么线性搜索可能仍然比二分搜索更有效(并且代码肯定更不言自明)。只有当您有几十个或数百个值并且您执行了数百万次查找时,二分查找才真正有返回。

鉴于您的原始值,这是邪恶的、过早的优化。我只是想将它作为那些处理大量值(value)观的人的一个选择。

关于Java枚举按数字范围搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7299884/

相关文章:

java - 如何使java中的条件 block 只执行一次?

java - 有没有办法获取用 Graphics2D 绘制的椭圆的坐标?

java - 获取 WebService 端口时的 NPE

activerecord - Rails 4.1 枚举 : enum. 状态 = nil

c# - 如何将字符串设置为枚举变量?

c# - 降低字符串时解析枚举

c# - 在 C# 中,如何轻松地将枚举标志从一种类型映射到另一种类型?

java - JVM/GC 是否在程序/线程退出时调用 `finalize()`?

java - Spring Boot - 在类路径资源中创建名称为 'dataSource' 的 bean 时出错

java - 使用单元素枚举维护单例中的不同属性?