0

我在访问数组中的值时遇到问题,目的是从我试图获得最接近匹配的值中减去数组第 1 列中保存的值。我收到类型不匹配错误无法从 double 转换为 int

顺便说一句,我什至确定我是否以正确的方式解决问题。我有一张表,我在其中检查第 1 列中的值是否与我正在查找的值最接近,而该行中的其他列是需要返回的值。(如果你玩过的话,想想有点像 AD&D 中的一些桌子)

// Column 1 ability score,  2 Damage mod, 3 Lift , 4 carry, 5 drag
double arr [][] = {{1.01,-7,11,9,28},
                   {1.51,-6,25,12,63},
                   {2.01,-6,38,14,96},
                   {2.51,-5,51,14,96},
                   {3.01,-5,51,17,128}};

public double EXTcha(double cha) {
    double closestNo = 0;
    double lookingFor = cha;
    int reqIndex = 0;
    double i;

    for (int row=0; row < arr.length; row++) {
        System.out.println(row+"row \t");
        double currentDiff = (lookingFor-arr[i][0]);
        System.out.println(currentDiff+"diff \t");
        if (currentDiff < closestNo) {
            closestNo = currentDiff;
            System.out.println(closestNo+"closest \t");
            reqIndex = row;
        };
    }

    for (int column=0; column<arr[reqIndex].length;column++) {
        System.out.println(arr[reqIndex][column]+"\t");
    }

    return extcha;
}

这是进行建议更改后其他人的代码

// Column 1 ability score,  2 Damage mod, 3 Lift , 4 carry, 5 drag
double arr [][] = {{1.01,-7,11,9,28},
                   {1.51,-6,25,12,63},
                   {2.01,-6,38,14,96},
                   {2.51,-5,51,14,96},
                   {3.01,-5,51,17,128}};

public double EXTcha(double cha) {
    double closestNo = 50;
    double lookingFor = cha;
    int reqIndex = 0;

    for (int row=0; row < arr.length; row++) {
        System.out.println(row+"row \t");
        double currentDiff = Math.abs(lookingFor-arr[row][0]);
        System.out.println(currentDiff+"diff \t");
        if (currentDiff < closestNo){
            closestNo = currentDiff;
            System.out.println(closestNo+"closest \t");
            reqIndex = row;
        };
    }

    for (int column=0; column<arr[reqIndex].length;column++) {
        System.out.println(arr[reqIndex][column]+"\t");
}

    return extcha;
}

我遇到了另一个初始化closestNo为 0 的问题,这意味着当我对它进行测试时(currentDiff < closestNo)总是小于所以我将它设置为 50,它总是大于第 1 列中的双精度值。

我希望这可以帮助某人

4

4 回答 4

3

您已声明i为双精度,然后尝试将其用作(整数)数组索引。我想你想要double currentDiff = (lookingFor-arr[row][0]);

于 2012-05-07T13:07:54.803 回答
2

您的算法中有(至少)一个错误,这里:

double currentDiff = (lookingFor-arr[i][0]);

要获得最接近的匹配,您应该在此处使用差异的绝对值。否则,您很可能最终总是“匹配”最后一行(具有最高值),因为这将在上面的表达式中给出最小的否定结果。

(而且,正如其他人迅速提到的那样,您应该使用ints 来索引数组)。

总体而言,您的方法非常低级且脆弱。对于这项工作,您最好使用一个NavigableMap实现,例如,其中键是行中的第一个元素,值 a包含每行中的其余数字,例如:TreeMapList

NavigableMap<Double, List<Double>> characteristics = 
        new TreeMap<Double, List<Double>>();
characteristics.put(1.01, Arrays.asList(-7.0, 11.0, 9.0, 28.0));
...
Double key = characteristics.floorKey(cha);
// Null check omitted for brevity
List<Double> matchingCharacteristics = characteristics.get(key);
于 2012-05-07T13:07:40.520 回答
0

arr[i]需要i是数组的整数索引,但您声明idouble.

我想你想要arr[row],即double currentDiff = (lookingFor-arr[row][0]);

于 2012-05-07T13:07:57.977 回答
0

您正试图在索引 i: 处访问您的数组,arr[i][0]但 i 是双精度数。我认为你应该学习面向对象的编程和面向对象的设计,这样会更容易。

于 2012-05-07T13:08:43.123 回答