Pourquoi mon tri boucle semblent ajouter un élément où il ne devrait pas?
Je suis en train de trier un tableau de Chaînes de caractères à l'aide de compareTo()
. C'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 This Example Sorting is
Je suis d'obtention de résultats, mais pas les résultats que je veux obtenir, qui sont:
Hello This Example Is Sorting
Comment puis-je adapter mon code pour trier le tableau de chaîne correctement?
- Vous devriez vraiment travailler votre code de la convention.
- oui, je vais , d'infecter, je suis nouveau sur java . et a été totalement coincé avec elle , n'avait aucune idée de ce genre de problèmes mineurs ..
- Un peu les conseils que je peux vous donner lors de la programmation est de rester cohérent avec la convention. Si vous vous trompez une chose, faire une chose mal partout, au lieu de faire certains endroits et de mal et d'autres endroits.
Vous devez vous connecter pour publier un commentaire.
Votre sortie est correcte. Désigner les caractères blancs de "Bonjour" et "Ce" au début.
Un autre problème est avec votre méthodologie. Utiliser le
Arrays.sort()
méthode:De sortie:
Ici, le troisième élément du tableau "est" devrait être "Est", sinon il viendra en dernier, après le tri. Parce que la méthode de tri utilise en interne la valeur ASCII pour trier les éléments.
text
2)code
. et puis j'ai crééarraylist
. et je veuxarraylist
éléments à l'égard detext
?En dehors de l'alternative des solutions 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 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 de vos chaînes par la comparaison de chaque chaîne avec les chaînes qui est venu après, il. Voici une version corrigée (j'ai retenu le plus de ton code d'origine, pour illustrer ce qui était "mal" avec elle):
Lecture
Le problème avec cette approche est que son complexité asymptotique 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 à propos de de meilleures façons de trier les données, comme quicksort.
À la place de cette ligne
utiliser cette ligne
et vous êtes bon pour aller. La raison de votre code actuel n'est pas le travail, c'est expliqué par d'autres utilisateurs. Au-dessus de remplacement est une solution parmi plusieurs que vous pourriez appliquer.
Je sais que c'est une réponse tardive, mais peut-être que ça peut aider quelqu'un.
La suppression des espaces blancs peut être fait en utilisant la fonction trim ().
Après cela, si vous souhaitez trier le tableau avec la casse manière, vous pouvez simplement utiliser:
et pour le cas de manière insensible:
Espérons que cette aide!
À partir de Java 8, vous pouvez également utiliser
parallelSort
ce qui est utile si vous avez des tableaux contenant beaucoup d'éléments.Exemple:
Si vous voulez ignorer le cas, vous pouvez utiliser:
sinon
B
sera avanta
.Si vous voulez ignorer les espaces lors de la comparaison, vous pouvez utiliser
trim()
:Voir:
" Hello " , " This " , "is ", "Sorting ", "Example"
Tout d'abord, vous fourni des espaces dans
" Hello "
et" This "
, les espaces ont une valeur inférieure à celle des caractères alphabétiques en Unicode, et il est imprimé en premier. (Le reste des personnages ont été triées par ordre alphabétique).Maintenant majuscules ont une valeur inférieure à celle d'une lettre minuscule en Unicode, donc "Exemple" et "Tri" est imprimé, puis à la fin
"is "
qui a la valeur la plus élevée.Si vous utilisez:
vous obtiendrez:
qui je pense est la sortie que vous recherchez.
Pour commencer, votre problème est que vous utilisez la méthode compareTo() qui est sensible à la casse. Cela signifie que les majuscules sont triés en dehors de la baisse des cas. La raison en est qu'il traduit en Unicode où les majuscules sont présentés avec des chiffres qui sont moins que le nombre de cas inférieur. Ainsi, vous devez utiliser `compareToIgnoreCase()` autant également mentionné dans les messages précédents.
C'est mon exemple de l'approche de la façon dont vous pouvez le faire effecively
Après vous créez un objet de la Comparateur vous pouvez la passer dans cette version de " trier()` qui sont définis dans java.util.Les tableaux.
jetez un coup d'oeil à super. Cela permet de s'assurer que le tableau qui est transmis est combatible avec le type de comparateur.
La magie de la partie de cette voie est que vous pouvez facilement trier le tableau de chaînes de caractères dans les l'ordre Inverse vous pouvez facilement le faire par:
Alternative De Choix
La méthode
compareToIgnoreCase()
, bien que cela fonctionne bien avec de nombreuses occasions(tout comme la comparaison de chaînes en anglais),il aura l'habitude de bien travailler avec tous les langues et les lieux. Cela le rend automatiquement une inapte choix pour les utiliser. Assurez-vous qu'il sera suppoorted partout où vous devez utilisercompare()
de java.texte.Collateur.Vous pouvez trouver un collateur de votre emplacement, par l'appel de la méthode
getInstance()
. Après cela, vous devez définir cette Collateur de la force de la propriété. Cela peut être fait avec lesetStrength()
méthode avecCollator.PRIMARY
comme paramètre. Avec cette alternative de choix le IgnocaseComp peut être écrit comme ci-dessous. Cette version de code génère le même résultat, indépendamment de l'emplacement