当前位置: 首页 > 面试题库 >

Java枚举按数字范围搜索

阎晔
2023-03-14
问题内容

是否可以像下面那样进行枚举

enum {

 10  poor
 100  rich
 1000 very_rich


}

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


问题答案:

enum如其他建议的那样,将with与值一起使用。

然后,提供一种静态lookup(int)方法,该方法通过对所有值的有序列表/数组执行二进制搜索,而不是对枚举值执行强力迭代搜索。

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

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

编辑:按要求编写代码示例。

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已经排序。否则,快速排序(pun!)应该可以解决问题。

这可能不是最有效的实现,只是从Wikipedia上的伪代码改编而成的快速而肮脏的实现。

如果您的值少于(例如)一打,那么线性搜索可能仍然比二进制搜索更有效(并且代码肯定更自解释)。只有当您拥有数十个或数百个值并且执行数百万次查找时,二进制搜索才真正奏效。

给定您的原始值,这是邪恶的,过早的优化。我只是想将其作为那些使用大量价值观的人的一种选择。



 类似资料:
  • 问题内容: 我正在使用Python 2.5,我想要这样的枚举(从1开始而不是0): 我知道在python 2.6中可以执行以下操作:h = enumerate(range(2000,2005),1)给出上述结果,但是在python2.5中您不能… 使用python2.5: 有谁知道在python 2.5中获得理想结果的方法? 谢谢, 杰夫 问题答案: 正如您已经提到的,在Python 2.6或更高

  • 问题内容: 如果我只想在循环中使用索引,则最好将函数与 还是?即使我根本不使用? 问题答案: 我会使用它,因为它更通用- 例如它将在可迭代对象和序列上工作,并且仅返回对对象的引用的开销并不算大-尽管(对我而言)按您的意图更易于阅读- 在不支持…的物体上折断

  • 使用Lucene libs,我需要对现有的搜索函数进行一些更改:假设以下对象: 名称:“端口对象1” 数据:"TCP(1)/1000-2000" 查询(或搜索文本)为“1142”,是否可以在数据字段内搜索“1142”并找到端口对象1,因为它指的是1000-2000之间的范围? 我只找到了数值范围查询,但这不适用于本例,因为我不知道范围。。。 参考以上代码。查询"1200"应该找到第一个doc。 L

  • 问题内容: 以下哪项将被认为是更好/更清晰/更快/更多的“ Pythonic”?我不在乎列表的内容,只关心它的持续时间。 要么 如果有什么不同,该函数也会利用。 问题答案: 一些快速的计时运行似乎使第二个选项略有优势: 只是为了好玩而已(Python v2.7.2) 我希望 首先 使用 可读代码 ,然后使用(如果可用)(例如,Python 3.x之前的版本),然后使用和。

  • 我的Rest API中有一个字段(在++中实现),它是一组封闭的数值。例如,员工等级,它可以是以下值之一:。而不是,则不能为每个值定义匹配字符串。 我正在尝试获得生成的文档,以便为这些值提供一个数字枚举。我尝试了以下方法: > 使用以下属性定义整数:。没有显示任何枚举,只是在将的类型更改为之后。因此不幸的是,只能与String参数一起工作,而我不希望我的模型是这样的。employeeRank必须是