2014-07-09 5 views
0

J'ai besoin de trier les INDEXES d'un tableau qui contient des valeurs doubles. Le tri doit être fait dans l'ordre croissant. Je le fais de la manière suivante (voir ci-dessous). Cela fonctionne correctement si un tableau contient des valeurs entières, mais il arrête de travailler avec des valeurs doubles. Pourquoi? Veuillez noter que je trie les index, pas les valeurs d'un tableau. Le résultat devrait être [1,0], ce qui fait référence à [893.05,1129.25].Comment trier un tableau par index d'entrée?

double[] times = new double[2]; 

times[0] = 1129.25; 
times[1] = 893.05; 

ArrayIndexComparator comparator = new ArrayIndexComparator(times,0); 
Integer[] sortedTimes = comparator.createIndexArray(); 
Arrays.sort(sortedTimes, comparator); 

public class ArrayIndexComparator implements Comparator<Integer> 
{ 
    private double[] array; 
    private int sort; 

    public ArrayIndexComparator(double[] array, int sort) 
    { 
     this.array = array; 
     this.sort = sort; 
    } 

    public Integer[] createIndexArray() 
    { 
     Integer[] indexes = new Integer[array.length]; 
     for (int i = 0; i < array.length; i++) 
     { 
      indexes[i] = i; 
     } 
     return indexes; 
    } 

    @Override 
    public int compare(Integer index1, Integer index2) 
    { 
     if (sort == 0) 
      return Double.compare(array[index2],array[index1]); // descending order ...2,1,0 
     else 
      return Double.compare(array[index1],array[index2]); // ascending order 0,1,2,... 
    } 
} 

Répondre

1

Dans la méthode compare de votre comparateur personnalisé, vous triez par ordre décroissant puisque vous avez le jeu de champs sort-0 dans l'appel à votre constructeur.

il suffit de remplacer le 0 avec tout autre nombre dans ArrayIndexComparator comparator = new ArrayIndexComparator(times,0);

par exemple, ArrayIndexComparator comparator = new ArrayIndexComparator(times,1);

+0

Je l'ai fait. Le contenu de sortedTimes est absolument le même: [0,1], ce qui fait référence à [1129.25,893.05]. Je ne sais pas pourquoi cela arrive. –

+0

@KlausosKlausos Je ne comprends pas, la commande est différente pour asc et desc donc où est le problème? – Thomas

+0

Si j'exécute ArrayIndexComparator comparator = new ArrayIndexComparator (times, 1) ;, alors le résultat est le même pour ArrayIndexComparator comparateur = new ArrayIndexComparator (times, 0); –

0

je n; comprends pas bien ce que vous avez dit, mais je suis arrivé le résultat que vous vouliez que la modification de la fonction de comparaison

@Override 
    public int compare(Integer index1, Integer index2) 
    { 

     if (index1<index2){ 
      return 1; 
     } 
     else if (index1>index2){ 
      return -1; 
     } 
     else{ 
      return 0; 
     } 
    } 
+0

Je dois comparer les valeurs d'un tableau, pas les index. –

+0

Ensuite, la façon @manouti est juste.Désolé pour la mauvaise réponse – tudoricc

0
ArrayIndexComparator comparator = new ArrayIndexComparator(times,1); 

L'utilisation ci-dessus (en passant de 1 à demander de trier par ordre croissant), je suis obtenir des valeurs appropriées dans l'ordre croissant.

Code d'essai

for(Integer op : sortedTimes) 
    { 
     System.out.println(times[op]); 
    } 

de sortie

893.05 
1129.25