java - 动态设置索引。这样所有可能的输入都可以被第一个整除

标签 java math

当每个数字将最后一个数字加倍时(15 * 2 = 30,30 * 2 = 60 ...),如何使用一组数字(所有数字都可以被第一个数字[在本例中为15]整除)来获取它们各自的索引。我正在寻找一种数学方法来完成此任务,但它却无法实现。我想要一行代码(或一个简短的方法)来替换下面的 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;
    }

在上述情况下,间隔将始终是四种情况之一。我的数学大脑已经检查了一晚上,我想不出如何使用数字 15、30、60 和 120 来获得索引 0、1、2 和 3。我知道这个问题有一个简单的答案,但已经晚了,我无法理解!

注释:

-如果你对这个问题有更好的名字,请评论,我的很糟糕

-我知道我可以(并且在上面摘录的同一个类中)使用 Calendar 实例和 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

关于java - 动态设置索引。这样所有可能的输入都可以被第一个整除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550322/

相关文章:

c++ - 计算 floor(pow(2,n)/10) mod 10 - pow(2,n) 的数字总和

optimization - 参数空间受限时如何运行梯度下降算法?

根据浏览量/评论计算页面重要性的算法

java - ArrayList 公共(public)构造函数 - "Constructs an empty list with an initial capacity of ten"- 在哪里?

java - 在 Eclipse 中从 Java 访问 Scala 实例变量

algorithm - 优雅/干净(特例)直线网格遍历算法?

java - 更改 Apache Commons Math 中数字系统的基数

java - 如何让每个相同字符的计数仅显示一次?

java - Spring Security getAuthentication() 返回 null

java - 隐藏变量值