量化级方法

时间:2011-11-14 22:12:13

标签: java android math

尝试找到一种更优雅的方法来创建具有离散级别的int。我的例子只显示了6个不同的级别,但是我想要为45个不同的级别执行此操作,所以不要想要45个elses。不确定在数学中这叫什么,所以似乎找不到我想要的东西。

sd = some double value

int level = 0;

if (Double.compare(sd, 0.41) >= 0) {
    level = 5;
} else if(Double.compare(sd, 0.25) >= 0) {
    level = 4;
} else if(Double.compare(sd, 0.11) >= 0) {
    level = 3;
} else if(Double.compare(sd, 0.05) >= 0) {
    level = 2;
} else if(Double.compare(sd, 0.02) >= 0) {
    level = 1;
}

................

最新更新FYI这些是我需要量化的值: 正如你所看到的,我需要一些更优雅的东西,使用Navigable Map回答

public static final int[] Levels = { 
        3100, 3250, 3383, 3517, 3650, 
        3673, 3695, 3718, 3740, 3760, 
        3780, 3800, 3820, 3853, 3885,
        3918, 3950, 3975, 4000, 4025, 4050
        };

4 个答案:

答案 0 :(得分:5)

http://download.oracle.com/javase/6/docs/api/java/util/NavigableMap.html

NavigableMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
map.put(0, 0);    // 0..4     => 0
map.put(5, 1);    // 5..10    => 1
map.put(10, 2);   // 10..100  => 2
......

您也可以使用Double数据类型实现它。

答案 1 :(得分:3)

我会将您的阈值存储在一个集合中,然后找到与您的输入相关的最高阈值的位置。

实施例

double[] thresholds = { 0.0, 0.025, 0.05, 0.1, 0.2 };

int level(double d) {
    for(int i = 0; i < thresholds.length; i++) {
        if(thresholds[i] > d) return i;
    }
    return thresholds.length + 1;
}

现在这是订单n。您可以通过使用二进制搜索使其成为订单日志来加快速度。

答案 2 :(得分:1)

创建一个包含所有级别边界的数组double[] boundary = { 0.4, 0.2, 0.1...};。然后循环遍历此数组,直到您的值大于边界。循环的索引是您的离散级别。

(注意,如果你的等级实际上是对数的,正如其他人已经注意到你不一定需要自定义数组...)

答案 3 :(得分:0)

对我来说看起来像是一个基于2对数的函数。

编辑:好的,所以你的真实功能并不完全以对数为基础。你可以尝试一些事情。我想我尝试的第一件事是尝试获取值的某种回归(对数?)。如果这不起作用,总会有其他人建议的表方法。我想尝试(但还没有)的另一种数值解算方法是Eureqa