98 votes

Comment trier un tableau d'entiers en utilisant un comparateur personnalisé ?

J'ai besoin de trier un tableau d'entiers en utilisant un comparateur personnalisé, mais la bibliothèque Java ne fournit pas de fonction de tri pour les entiers avec des comparateurs (les comparateurs ne peuvent être utilisés qu'avec des objets). Existe-t-il un moyen simple de le faire ?

0 votes

Voulez-vous simplement trier le tableau par ordre décroissant ou voulez-vous effectuer quelque chose de plus compliqué ?

1 votes

Quelque chose de plus compliqué. Je veux trier les int en utilisant la valeur absolue comme clé.

0voto

Emil Points 5513

J'ai essayé au maximum d'utiliser le comparateur avec le type primitif lui-même. Finalement, j'ai conclu qu'il n'y avait aucun moyen de tromper le comparateur, et voici mon implémentation.

public class ArrSortComptr {
    public static void main(String[] args) {

         int[] array = { 3, 2, 1, 5, 8, 6 };
         int[] sortedArr=SortPrimitiveInt(new intComp(),array);
         System.out.println("InPut "+ Arrays.toString(array));
         System.out.println("OutPut "+ Arrays.toString(sortedArr));

    }
 static int[] SortPrimitiveInt(Comparator<Integer> com,int ... arr)
 {
    Integer[] objInt=intToObject(arr);
    Arrays.sort(objInt,com);
    return intObjToPrimitive(objInt);

 }
 static Integer[] intToObject(int ... arr)
 {
    Integer[] a=new Integer[arr.length];
    int cnt=0;
    for(int val:arr)
      a[cnt++]=new Integer(val);
    return a;
 }
 static int[] intObjToPrimitive(Integer ... arr)
 {
     int[] a=new int[arr.length];
     int cnt=0;
     for(Integer val:arr)
         if(val!=null)
             a[cnt++]=val.intValue();
     return a;

 }

}
class intComp implements Comparator<Integer>
{

    @Override //your comparator implementation.
    public int compare(Integer o1, Integer o2) {
        // TODO Auto-generated method stub
        return o1.compareTo(o2);
    }

}

Roman : Je ne peux pas dire que c'est un bon exemple, mais puisque vous l'avez demandé, c'est ce qui m'est venu à l'esprit. Supposons que dans un tableau, vous voulez trier des nombres en fonction de leur valeur absolue.

Integer d1=Math.abs(o1);
Integer d2=Math.abs(o2);
return d1.compareTo(d2);

Un autre exemple peut être que vous voulez trier seulement les nombres supérieurs à 100. Cela dépend en fait de la situation. Je ne peux pas penser à d'autres situations. Peut-être qu'Alexandru peut donner plus d'exemples puisqu'il dit qu'il veut utiliser un comparateur pour un tableau d'int.

0 votes

@Emil : désolé d'être un peu hors sujet, mais je suis juste curieux, pourriez-vous me montrer un exemple de comparateur que vous avez utilisé pour trier un tableau d'entiers ? Je n'arrive pas à imaginer une implémentation autre que celle de return sign * (i1 - i2); donde sign est -1 ou +1 selon l'ordre souhaité.

0 votes

@Emil : en fait, l'implémentation que je viens de montrer est probablement cassée (les ints devraient être castées en long au début) mais cela n'a pas d'importance dans le contexte.

0 votes

Voulez-vous dire qu'un comparateur pour les nombres entiers n'est pas nécessaire, à part le tri par ordre croissant et décroissant ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X