2013-05-11 3 views
1

J'ai donc un problème pour trier une ArrayList. Je suis obligé d'utiliser dans la méthode d'insertion, donc j'écris ce code en fonction de cela. Ce que cela est destiné à faire, c'est que l'utilisateur doit entrer 4 mots de 3 lettres et ensuite triés dans l'ArrayList dans l'ordre alphabétique. J'ai essayé différentes choses mais quand je cours le code il trie le premier mot mais le répète. La sortie dépend vraiment des mots que je mets. J'ai l'impression que mon problème est dans la boucle while mais j'ai essayé différentes manières mais j'ai le même problème. Toute aide est grandement appréciée.J'ai des problèmes avec le tri

import java.util.ArrayList; 
import TerminalIO.KeyboardReader; 

public class Insert{ 
    public static void main(String[] args) { 
     int i,j; 
     String tmp; 
     ArrayList<String> words = new ArrayList<String>(); 
     int run = 4; 
     KeyboardReader reader = new KeyboardReader(); 
     while(run!=0) { 
      words.add(reader.readLine("Enter a three letter word: ")); 
      run--; 
     } 


     for (j=1; j<words.size(); j++) { 
      i = j - 1; 
      tmp = words.get(j); 

      while ((i>=0) && (tmp.compareTo(words.get(i)) < 0)){ 
       words.set(i,tmp); 
       words.set(i+1,words.get(i)); 
       i--; 
      } 

     //words.set(i+1,tmp); 

     } 

     for(int r = 0; r<words.size(); r++) 
      System.out.print(words.get(r) + " "); 

    } 
} 
+0

Avez-vous d'implémenter votre propre genre ou tout simplement tenu de Trier? Si vous voulez simplement un tri, essayez Collections.sort (mots). Va trier par ordre alphabétique. – arynaq

+1

Je pense qu'il est un étudiant; les élèves devraient faire les choses à la main au moins une fois. –

+1

Oui Je suis un étudiant, le concept Collection.sort n'est pas bon pour moi car j'essaie d'apprendre à modifier la méthode d'insertion pour trier les chaînes. – Johngianni

Répondre

0

Pourquoi ne pas simplement utiliser Collections.sort au lieu de vous-même le tri. Cela ressemblerait à ceci après votre boucle while:

while(run!=0){ 
    words.add(reader.readLine("Enter a three letter word: ")); 
    run--; 
} 
Collections.sort(words); 
+0

Cela semble être une bonne idée, mais nous devons comprendre comment fonctionne la méthode d'insertion. Il y a quelques méthodes comme la méthode d'insertion et la méthode de bulle et nous devons le faire en utilisant la méthode d'insertion spécifiquement. – Johngianni

1

La raison pour laquelle vous vous retrouvez avec des mots dupliqués est le bloc while:

while ((i>=0) && (tmp.compareTo(words.get(i)) < 0)){ 
    words.set(i,tmp); 
    words.set(i+1,words.get(i)); 
    i--; 
} 

Vous définissez le i mot -ème à tmp, puis vous définir le mot i+1 -th au mot i -th, qui est tmp. Je crains que vous n'ayez aussi des problèmes d'organisation de code. Tout d'abord, essayez de créer un objet Insert, puis d'appeler des méthodes. Rendez vos méthodes plus petites; chaque méthode devrait faire une seule chose.

+0

J'ai probablement des problèmes pour organiser le code. Quand vous dites que je mets le mot i + 1 au mot i, tmp est words.get (j) ce qui en fait un index différent. Je suis juste confus sur la façon d'obtenir ce tri de la bonne façon. – Johngianni

+0

Quand j'exécute cette partie du code n'est-ce pas commuter le mot choisi de l'indice j index un derrière lui parce que i = j-1. Après que je fais cela, j'ai mis le mot qui a été comparé et était situé derrière j dans la place de j et cela est fait aussi longtemps que la boucle while est correcte – Johngianni

+0

J'ai réussi à résoudre le problème. J'ai enlevé words.set (i, tmp); de la boucle while et dans la boucle for le code que j'ai laissé commenté je l'ai remplacé par words.set (i + 1, tmp) et maintenant ça marche. Merci pour le soutien si. – Johngianni

0

Si vous avez besoin de le faire de cette façon particulière, vous devez utiliser une variable de chaîne dans la seconde boucle while, appelons-le tmp2:

while ((i>=0) && (tmp.compareTo(words.get(i)) < 0)){ 
    tmp2 = words.get(i); 
     words.set(i,tmp); 
     words.set(i+1,tmp2); 
     i--; 
    }