目前我有一个类似于下面的块:
if (number< 11 && number>= 5) {
return 1;
} else if (number< 15 && number>= 11) {
return 2;
} else if (number< 45 && number>= 15) {
return 3;
}
有一个更好的方法吗?
目前我有一个类似于下面的块:
if (number< 11 && number>= 5) {
return 1;
} else if (number< 15 && number>= 11) {
return 2;
} else if (number< 45 && number>= 15) {
return 3;
}
有一个更好的方法吗?
如何计算结果?
return number / 5;
编辑:
正如评论所指出的,这仅在number
>= 0 时才有效。如果不是这种情况,只需添加适当的 if 语句。
你可以尝试做一些体操
return (int)number/5
这将完全按照您的代码正在执行的操作
只要你的范围遵循几乎任何数学模式,你就可以做类似的事情
我会使用两个数组,1 个用来保存要比较的数字,另一个用来保存答案。显示此方法的一个非常简单的示例:
public int getResult(int number) {
int[] results = { 1, 2, 3 };
int[] numbers = { 5, 11, 15, 45 };
for(int i = 0; i < numbers.length - 1; i++) {
if (between(number, numbers[i], numbers[i+1])) {
return results[i];
}
}
//return a default value
//return results[results.length - 1];
return 0;
}
public boolean between(int x, int a, int b) {
return (x >= a && x < b);
}
如果您能够使用Guava库,它提供了一种检查范围的简化方法,而不是普通的 if 语句。这是对您方法中的代码行的改进。然而,这样做的一次性改进是值得怀疑的,但在我看来它确实使它更具可读性。
在您的情况下,您可以有一个提供低端点和高端点的方法。您的逻辑与closedOpen
of匹配Ranges
:{x | a <= x < b}
private int getNumber(int low, int high, int n)
{
if (Ranges.closedOpen(low, high).contains(n))
{
// return the number
}
}
但这稍微复杂一些,因为您使用更多 if 语句来增加复杂性以知道要返回哪个数字。如果有这类事情的字典就好了!
看起来你想要一个NavigableMap
. 具体可以使用floorKey
操作。
该floorKey(K key)
方法用于返回小于或等于给定键的最大键,如果没有这样的键,则返回 null。
这是一个例子:
NavigableMap<Integer,Integer> map = new TreeMap<Integer, Integer>();
map.put(0, 0);
map.put(5, 1);
map.put(11, 2);
map.put(15, 3);
map.put(46, 0);
System.out.println(map.get(map.floorKey(6))); // 1
System.out.println(map.get(map.floorKey(11))); // 2
System.out.println(map.get(map.floorKey(23))); // 3
请注意,还有ceilingKey
, lowerKey
, higherKey
, and also …Entry
instead of…Key
操作,它们返回 aMap.Entry<K,V>
而不仅仅是K
.
如果你确定数字是 5 的倍数,正如@Luggi 评论的那样,你可以简单地做
return (number - 5) / 5;
除以 5 时可以返回最大的整数。
return Math.floor(number/5)