0

目前我有一个类似于下面的块:

if (number< 11 && number>= 5) {
    return 1;
} else if (number< 15 && number>= 11) {
    return 2;
} else if (number< 45 && number>= 15) {
    return 3;
}

有一个更好的方法吗?

4

6 回答 6

10

如何计算结果?

return number / 5;

编辑:

正如评论所指出的,这仅在number>= 0 时才有效。如果不是这种情况,只需添加适当的 if 语句。

于 2013-04-30T14:47:20.170 回答
5

你可以尝试做一些体操

return (int)number/5

这将完全按照您的代码正在执行的操作

只要你的范围遵循几乎任何数学模式,你就可以做类似的事情

于 2013-04-30T14:47:28.967 回答
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);
}
于 2013-04-30T14:48:08.030 回答
1

如果您能够使用Guava库,它提供了一种检查范围的简化方法,而不是普通的 if 语句。这是对您方法中的代码行的改进。然而,这样做的一次性改进是值得怀疑的,但在我看来它确实使它更具可读性。

在您的情况下,您可以有一个提供低端点和高端点的方法。您的逻辑与closedOpenof匹配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 …Entryinstead of…Key操作,它们返回 aMap.Entry<K,V>而不仅仅是K.

于 2013-05-01T19:32:25.600 回答
0

如果你确定数字是 5 的倍数,正如@Luggi 评论的那样,你可以简单地做

return (number - 5) / 5;
于 2013-04-30T14:47:50.813 回答
0

除以 5 时可以返回最大的整数。

return Math.floor(number/5)
于 2013-04-30T14:49:54.447 回答