Java中我的比较器接口的ArrayIndexOutOfBoundsException

Java中我的比较器接口的ArrayIndexOutOfBoundsException,java,comparator,comparable,Java,Comparator,Comparable,我正在学习比较器接口来解决分数背包问题。行a和b中的两个数组表示3个值-权重对-(60,20)、(100,50)、(120,30)。比较器应该根据v[i]/w[i]的比率对arr[]进行排序。但是,以下代码给了我一个奇怪的错误: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 我的比较器似乎试图访问arr[]的index=3,但我不能限制它对索引的访问。有什么解决办法吗 这是我的密码: int[] v

我正在学习比较器接口来解决分数背包问题。行a和b中的两个数组表示3个值-权重对-(60,20)、(100,50)、(120,30)。比较器应该根据v[i]/w[i]的比率对arr[]进行排序。但是,以下代码给了我一个奇怪的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
我的比较器似乎试图访问arr[]的index=3,但我不能限制它对索引的访问。有什么解决办法吗

这是我的密码:

int[] v = {60, 100, 120};  // v: values. line a
int[] w = {20, 50, 30};   // w: weights. line b
int len = v.length;
Integer[] arr = new Integer[len];

for (int i=0; i<len; i++) 
  arr[i] = v[i] / w[i];

//sort arr[] based on the ratios of v[i]/w[i]
Arrays.sort(arr, new Comparator<Integer>() {
  @Override public int compare(Integer o1, Integer o2) {
      return Double.compare(v[o1]/w[o1], v[o2]/w[o2]);
  }
});

double[] v_sorted = new double[len];
double[] w_sorted = new double[len];
for (int i = 0; i < len; ++i) {
  v_sorted[i] = v[arr[i]];
  w_sorted[i] = w[arr[i]];
}
int[]v={60100120};//五:价值观。a线
int[]w={20,50,30};//w:重量。b行
int len=v.长度;
整数[]arr=新整数[len];

对于(int i=0;i而言,问题在于您试图对索引进行排序,如比较器代码中的
o1
o2
所示,但您的
arr
包含预先计算的比率

将数字
0
通过
len-1
填充到数组中,可以解决以下问题:

for (int i=0; i<len; i++) 
    arr[i] = i;

for(int i=0;i在您的代码中,您需要双精度,但您正在创建
Integer
数组。还存在一些其他逻辑错误。请查看以下内容:

import java.util.Arrays;

public class Example {

    public static void main(String[] args) {

        // Initialize arrays `values`,`weights`,arr
        int[] values = { 60, 100, 120 };
        int[] weights = { 20, 50, 30 };
        int valuesArrayLength = values.length;

        Double[] array = new Double[valuesArrayLength];

        // For loop
        for (int i = 0; i < valuesArrayLength; i++)
            array[i] = (double) (values[i] / weights[i]);

        //Pre Java8 way(@Deprecated)
        // Arrays.sort(arr, new Comparator<Double>() {
        //     @Override
        //      public int compare(Double o1, Double o2) {
        //        return Double.compare(o1,o2);
        //     }
        // });
        // Sort array using a Comparator (lambda expression)
        Arrays.sort(array, (o1, o2) -> Double.compare( o1,o2));
        //The above can be even reduced to (method reference)
        //Arrays.sort(array, Double::compare);

        // Finally
        int[] valuesSorted = Arrays.stream(values).sorted().toArray();
        int[] weightsSorted = Arrays.stream(weights).sorted().toArray();

        // Testing the arrays
        System.out.println("array sorted:" + Arrays.toString(array));
        System.out.println("valuesSorted:" + Arrays.toString(valuesSorted));
        System.out.println("weightsSorted:" + Arrays.toString(weightsSorted));
    }
}
导入java.util.array;
公开课范例{
公共静态void main(字符串[]args){
//初始化数组'values','weights',arr
int[]值={60100120};
int[]权重={20,50,30};
int valuesArrayLength=values.length;
Double[]数组=新的Double[valuesArrayLength];
//For循环
对于(int i=0;iDouble.compare(o1,o2));
//上述内容甚至可以简化为(方法参考)
//sort(数组,Double::compare);
//最后
int[]valuesSorted=Arrays.stream(values).sorted().toArray();
int[]weightsorted=Arrays.stream(weights.sorted().toArray();
//测试阵列
System.out.println(“数组排序:+Arrays.toString(数组));
System.out.println(“valuesserted:+Arrays.toString(valuesserted));
System.out.println(“weightsorted:+array.toString(weightsorted));
}
}

数组
v
在哪里,或者变量
v
在代码中的位置?我想你的意思是
而不是
v
权重
而不是
w
。如果你把它们放在那里就好了。。。