2013-09-01 4 views
0

J'essaie d'utiliser l'été pour pratiquer plus de Java pour m'améliorer en apprenant à coder les algorithmes. J'ai ce problème où j'ajoute des éléments à mon ArrayList mais d'une manière ou d'une autre le premier nombre que j'ajoute fixe également le nombre de positions dans ma liste que je veux éviter. Je veux seulement que le 0ème index contienne le numéro 5. Je n'ai pas l'air de comprendre comment résoudre ce problème.Java Bubblesort Algorithm

public class Algorithms { 

private ArrayList<Integer> numbers; 

public Algorithms() { 

    numbers = new ArrayList<Integer>(); 
    numbers.add(5); 
    numbers.add(4); 
    bubblesort(); 
} 

public static void main(String args[]) { 
    new Algorithms(); 
} 

public void bubblesort() { 

    System.out.println(numbers); 
    for (int a = 0; a < numbers.size();) { 
     for (int b = 1; b < numbers.size();) { 
      int currentNumber = numbers.get(a); 
      if (currentNumber > numbers.get(b)) { 

       //Collections.swap(numbers, currentNumber, numbers.get(b)); 

       numbers.set(numbers.get(a), numbers.get(b)); 
       numbers.set(numbers.get(b), numbers.get(a)); 

       a++; 
       b++; 

      } else if (currentNumber < numbers.get(b)) { 
       a++; 
       b++; 
      } 
      System.out.println(numbers); 
     } 
    } 
} 
} 
+0

Que pensez-vous 'numbers.set (numbers.get (a), numbers.get (b));' devrait être en train de faire? Avez-vous regardé l'API 'ArrayList'? –

Répondre

3

Vous ne permutez pas correctement les éléments. Au lieu de

numbers.set(numbers.get(a), numbers.get(b)); 
numbers.set(numbers.get(b), numbers.get(a)); 

il devrait être

int temp = numbers.get(a); 
numbers.set(a, numbers.get(b)); 
numbers.set(b, temp); 
+0

Bien que tout fonctionne maintenant, cependant quand je choisis d'ajouter plus d'éléments à la liste, je trie i, mais au détriment d'une exception indexoutofBounds je sais que ça a à voir avec la variable temporaire int currentNumber = numbers.get (a) ; pointant vers l'index suivant de la liste qui n'existe pas. Je n'arrive pas à trouver un moyen de contourner ce problème si vous pouviez m'aider à trouver un moyen de contourner le problème. – JP24

1

Les deux déclarations ci-dessous:

numbers.set(numbers.get(a), numbers.get(b)); 
numbers.set(numbers.get(b), numbers.get(a)); 

ne fonctionne pas swapping. Le premier argument de la méthode est l'index dans la liste, où vous voulez définir la valeur transmise en tant que second argument. Vous devez utiliser une variable temp pour l'échange.

En outre, la permutation n'a pas fonctionné pour votre ligne commentée pour la même raison. Collections#swap méthode prendre des indices pour l'échange. Donc, il suffit de changer:

Collections.swap(numbers, currentNumber, numbers.get(b)); 

à:

Collections.swap(numbers, a, b); 

Et s'il vous plaît, pour l'amour de tout ce qui est saint, don't call method from inside a constructor. Retirez l'appel de méthode à l'intérieur du constructeur, et le déplacer à la méthode principale comme ceci:

Algorithms algo = new Algorithms(); 
algo.bubbleSort() 
+0

Oh, c'est comme ça que je peux appeler les méthodes directement à partir de la méthode principale. Bravo :) – JP24

+0

@ JP24. Bien sûr. –