2016-09-25 15 views
2

我正在學習Comparator接口來解決分數揹包問題。行a和b中的兩個數組表示3個值 - 權重對 - (60,20),(100,50),(120,30)。比較器應該根據v [i]/w [i]的比值對arr []進行排序。但是,下面的代碼給了我奇怪的錯誤:ArrayIndexOutOfBoundsException對於我的Java比較器接口

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 

我比較似乎是試圖訪問索引的ARR [] = 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]]; 
} 
+0

哪裏是數組'v'或者是變量'v '在代碼中?我認爲你的意思是'values'而不是'v'和'weights'而不是'w'.如果你在那裏正確地使用它,那將是非常棒的...... – GOXR3PLUS

回答

0

的問題是,你正試圖索引排序,如o1o2在比較的代碼表示,但你arr包含預先計算的比率。

灌裝0通過len-1與數字陣列,包容性,將解決這個問題:

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

現在比較會得到一個配對索引,並比較基於他們的v[...]w[...]比率。

0

在你的代碼要雙打,但要創建Integer array.Also其他一些邏輯錯誤,在下面的exist.Have一看:

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)); 
    } 
}