70 votes

Tri d'un tableau de chaînes avec Java

J'essaie de trier un tableau de chaînes à l'aide de compareTo (). Ceci est mon code:

 static  String Array[]={" Hello " , " This " , "is ", "Sorting ", "Example"};
String  temp; 

public static void main(String[] args)

{    

 for(int j=0; j<Array.length;j++)
 {
     for (int i=j+1 ; i<Array.length; i++)
     {
         if(Array[i].compareTo(Array[j])<0)
         {
             String temp= Array[j];
             Array[j]= Array[i]; 
             Array[i]=temp;


         }
     }

     System.out.print(Array[j]);
 }
}
 

maintenant la sortie est: Hello Cet exemple Le tri est

J'obtiens des résultats, mais pas ceux que je veux obtenir. Pour moi, la logique est la bonne, alors quoi de mal ici, tout le monde peut m'aider, s'il vous plaît?

145voto

Juvanis Points 15491

Votre sortie est correcte. Dénote les caractères blancs de "Bonjour" et "Ceci" au début.

Un autre problème concerne votre méthodologie. Pourquoi n'utilisez-vous pas la méthode Arrays.sort() ?

 String[] strings = { " Hello ", " This ", "is ", "Sorting ", "Example" };
Arrays.sort(strings);
 

15voto

Prince Mabandla Points 306

Outre les solutions de rechange qui ont été postées ici (qui est correct), personne n'a vraiment répondu à votre question d'aborder ce qui était incorrect avec votre code.

Il semble comme si vous essayiez de mettre en œuvre un tri de la sélection de l'algorithme. Je n'entrerai pas dans les détails de la façon dont le tri fonctionne ici, mais j'ai inclus quelques liens utiles pour votre référence =)

Votre code est syntaxiquement correct, mais logiquement faux. Vous avez été partiellement tri des chaînes par comparaison de chaque chaîne avec les chaînes qui est venu après. Voici une version corrigée (j'ai retenu le plus de ton code d'origine, pour illustrer ce qui était "mal"):

static  String Array[]={" Hello " , " This " , "is ", "Sorting ", "Example"};
String  temp;

//Keeps track of the smallest string's index
int  shortestStringIndex; 

public static void main(String[] args)  
{              

 //I reduced the upper bound from Array.length to (Array.length - 1)
 for(int j=0; j < Array.length - 1;j++)
 {
     shortestStringIndex = j;

     for (int i=j+1 ; i<Array.length; i++)
     {
         //We keep track of the index to the smallest string
         if(Array[i].trim().compareTo(Array[shortestStringIndex].trim())<0)
         {
             shortestStringIndex = i;  
         }
     }
     //We only swap with the smallest string
     if(shortestStringIndex != j)
     {
         String temp = Array[j];
         Array[j] = Array[shortestStringIndex]; 
         Array[shortestStringIndex] = temp;
     }
 }
}

Lectures Complémentaires

Le problème avec cette approche est que son asymptotique de la complexité est O(n^2). Dans simplifiée des mots, il devient très lent, comme la taille de la matrice augmente (approche de l'infini). Vous pouvez lire sur les meilleures façons de trier les données, telles que quicksort.

9voto

narayanf1 Points 48

Au lieu de cette ligne

 if(Array[i].compareTo(Array[j])<0)
 

utiliser cette ligne

 if(Array[i].trim().compareTo(Array[j].trim())<0)
 

et vous êtes prêt à partir. La raison pour laquelle votre code actuel ne fonctionne pas est déjà expliquée par d'autres utilisateurs. Ce remplacement ci-dessus est une solution parmi plusieurs que vous pouvez appliquer.

4voto

Udit Seth Points 20

" Hello " , " This " , "is ", "Sorting ", "Example"

Tout d’abord, vous avez fourni des espaces en " Hello " et " This " , les espaces ont une valeur inférieure aux caractères alphabétiques en Unicode, ils sont donc imprimés en premier. (Le reste des caractères ont été triés par ordre alphabétique).

Désormais, les lettres majuscules ont une valeur inférieure à celle des minuscules en Unicode. Ainsi, "Exemple" et "Tri" sont imprimés, puis enfin "is " qui a la valeur la plus élevée.

2voto

Naira Simonyan Points 1
public static void main(String[] args) {
    String Array[] = { " f ", " c ", " a ", " g ", " d " };
    boolean swap = true;
    int j = 0;
    while (swap) {
        swap = false;
        j++;
        for (int i = 0; i < Array.length - j; i++) {
            if (Array[i].compareTo(Array[i + 1]) > 0) {
                String tmp = Array[i];
                Array[i] = Array[i + 1];
                Array[i + 1] = tmp;
                swap = true;
            }

        }

    }
}

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