是否可以像下面这样枚举
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/