小编典典
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上的伪代码改编而成的快速而肮脏的实现。
如果您的值少于(例如)一打,那么线性搜索可能仍然比二进制搜索更有效(并且代码肯定更自解释)。只有当您拥有数十个或数百个值并且执行数百万次查找时,二进制搜索才真正奏效。
给定您的原始值,这是邪恶的,过早的优化。我只是想将其作为那些使用大量价值观的人的一种选择。
2020-11-19