动态设置索引.使得所有可能的输入都能被第一个整除



如何使用一组数字(所有数字都可以被第一个整除[在本例中为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;
   }
}

相关内容

最新更新