Java中我的比较器接口的ArrayIndexOutOfBoundsException
我正在学习比较器接口来解决分数背包问题。行a和b中的两个数组表示3个值-权重对-(60,20)、(100,50)、(120,30)。比较器应该根据v[i]/w[i]的比率对arr[]进行排序。但是,以下代码给了我一个奇怪的错误: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
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
。如果你把它们放在那里就好了。。。