2016-09-25 13 views
2

私は分数のナップザック問題を解決するためにコンパレータインターフェイスについて学んでいます。線aとbの2つの配列は、(60、20)、(100,50)、(120,30)の3つの値 - 重量ペアを示します。コンパレータは、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

を'コードでは?' w'ではなく 'v'と' weights'の代わりに 'values'を意味すると思います。 – GOXR3PLUS

答えて

0

問題は、あなたのコンパレータのコードでo1o2で表されるようにあなたは、インデックスをソートするためにしようとしているが、あなたのarrは、事前に計算比が含まれていることです:

は、ここに私のコードです。包括的数字len-10、持つ配列を充填

は、問題を解決します:

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

今、コンパレータは、インデックスのペアを取得し、それらに基づいてv[...]w[...]の比率を比較します。あなたのコードで

0

あなたはダブルスをしたいが、あなたには、いくつかの他の人array.Also Integer論理エラーは以下をご覧exist.Have作成している:配列 `v`や場所が変数` Vです

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)); 
    } 
} 
関連する問題