如何使用一组数字(所有数字都可以被第一个整除[在本例中为15])来获得它们各自的索引,当每个数字都是最后一个的两倍时(15*2= 30,30 *2=60…)。我在寻找一种数学上的方法,但我想不起来。我想用一行代码(或一个简短的方法)来代替下面的switch语句。
考虑以下代码:
//represents "h:mm"
String[] values = new String[]{"0:15", "0:30", "1:00", "2:00"};
JComboBox<String> comboBox = new JComboBox<String>(values);
comboBox.setEditable(false); //only values of values can be used
...
switch(interval)
{
case 15:
comboBox.setSelectedIndex(0);
break;
case 30:
comboBox.setSelectedIndex(1);
break;
case 60:
comboBox.setSelectedIndex(2);
break;
case 120:
comboBox.setSelectedIndex(3);
break;
}
在上述情况下,interval
总是4种情况之一。我的数学脑子昨晚坏了,我想不出怎么用15、30、60和120这些数字来表示索引0、1、2和3。我知道这个问题有一个简单的答案,但是太晚了,我想不起来了!
指出:
-如果你有更好的名字,请评论一下,我的名字很糟糕
-我知道,我可以(并有在同一类上面的摘录是从)使用日历实例和ListCellRenderer更容易地完成这一点,但我遇到过这样的情况之前,不记得我是如何解决它!
单行替换
comboBox.setSelectedIndex((int)(Math.log(interval/15)/Math.log(2)));
下面是一个示例程序
public class Test {
public static void main(String[] args){
for(int interval: new int[]{15,30,60,120}){
System.out.println((int)(Math.log(interval/15)/Math.log(2)));
}
}
}
输出0
1
2
3
我不知道我是否正确理解了你的问题,但它是这样的吗?
int base = 15;
for(int i = base, j = 0 ; i < base * 4 ; i *= 2, j++) {
if(interval == i) {
comboBox.setSelectedIndex(j);
break;
}
}
请注意,根据您的示例,我只使用base * 4
作为循环条件,如果您愿意,您可以更改它。
您也可以通过使用下面来消除j
:
int base = 15;
for(int i = base ; i < base * 4 ; i *= 2) {
if(interval == i) {
comboBox.setSelectedIndex((i/base) - 1);
break;
}
}