2016-09-25 2 views
2

J'apprends l'interface de comparateur pour résoudre un problème de sac à dos fractionnaire. Les deux matrices des lignes a et b indiquent 3 paires valeur/poids - (60, 20), (100, 50), (120, 30). Le Comparateur est supposé trier arr [] sur la base des rapports de v [i]/w [i]. Cependant, le code suivant me donne une erreur bizarre:ArrayIndexOutOfBoundsException pour mon interface de comparateur en Java

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

Mon semble Comparator essayer d'accéder à l'index = 3 arr [], mais je ne peux pas limiter l'accès des indices. Des solutions?

Voici mon code:

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

Où est un tableau 'V' ou où est la variable' v 'dans le code? Je pense que vous voulez dire' values' au lieu de 'v' et' weights' au lieu de 'w'. Ce serait génial si vous les aviez correctement là ... – GOXR3PLUS

Répondre

0

Le problème est que vous essayez de trier les index, comme représenté par o1 et o2 dans votre code comparateur, mais votre arr contient des rapports pré-calculés.

Remplissage du tableau avec les numéros 0 par len-1, y compris, va résoudre le problème:

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

Maintenant, le comparateur va obtenir une paire d'indices et de comparer les rapports de v[...]-w[...] basés sur eux.

0

Dans votre code que vous voulez doubles mais vous créez Integer array.Also quelques autres erreurs logiques exist.Have un coup d'oeil au-dessous:

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