2011-01-13 19 views
0

Ich versuche, eine ArrayList mit Zeichenfolgen (PlayersNames) und ImageIcons (PlayersIcons) basierend auf den Werten zu sortieren, die ich in einer anderen ArrayList mit Ganzzahlen (Ergebnisse) speichern. Wie Sie sehen können, bekomme ich eine indexOutOfBoundsException, aber ich verstehe nicht warum. Vielleicht bringt mich der Morgengruß dazu, keine einfachen Dinge zu sehen.Sortierung ArrayList - IndexOutOfBoundsException -Java

ArrayList<String> PlayersNames=new ArrayList<String>; 
ArrayList<ImageIcon> PlayersIcons=new ArrayList<ImageIcons>; 

    public void sortPlayers(ArrayList<Integer> results){ 
     String tmp; 
     ImageIcon tmp2; 
     for (int i=0; i<PlayersNames.size(); i++) { 
      for (int j=PlayersNames.size(); j>i; j--) { 

       if (results.get(i) < results.get(i+1)) {  //IndexOutOfBoundsException! 

        tmp=PlayersNames.get(i+1); 
        PlayersNames.set(i+1,PlayersNames.get(i)); 
        PlayersNames.set(i,tmp); 

        tmp2=PlayersIcons.get(i+1); 
        PlayersIcons.set(i+1,PlayersIcons.get(i)); 
        PlayersIcons.set(i,tmp2); 
       } 
      } 
     } 
    } 
+2

Nun, offensichtlich gehen Sie über das Ende der Ergebnisliste hinaus, aber Sie haben den Code, der sortPlayers() aufruft, noch nicht gepostet, so dass wir nicht sagen können, wie groß diese Liste sein soll. Ist es genauso groß wie PlayersNames? Wenn dies der Fall ist, wird die letzte Iteration Ihrer Schleife, wenn i == PlayersNames.size() - 1, dazu führen, dass Sie aus dem Rahmen gehen, weil der Versuch, results.get (i + 1) aufzurufen, zu viel für die Ergebnisliste. –

Antwort

5

Wenn die Schleife an das Ende der ArrayList gelangt, versuchen Sie, ein Element über das Ende der Liste hinaus zu erhalten. Auf dieser Linie:

if (results.get(i) < results.get(i+1)) { 

Wenn i = 9, mit einem Arraylist mit 10 Stück, results.get (9) gibt Ihnen das letzte Element in der Liste. results.get (10) versucht, etwas zu erhalten, das nicht existiert.

1

Schließlich i kann einen Wert von PlayersNames.size()-1 halten. Ich kann nur annehmen, dass results die gleiche Größe wie PlayersNames, oder besser hat.

Wenn dies wahr ist, dann schließlich sind Sie für das results.size() -te Element zu fragen (von results.get(i+1) tun) in results, das ist eine mehr als results hält, damit ein IndexOutOfBoundsException geworfen wird.

prägnanter gesagt, wenn Ergebnisse N Artikel halten, dann ist das N -te Element zugegriffen wird, um den Index N-1 verwenden, aber Sie versuchen, das Element am Index N, zuzugreifen, die nicht existieren.

Versuchen Sie, Ihre äußere Schleife auf sich ändernde:

for (int i=0; i<PlayersNames.size()-1; i++) { 

zu verhindern, dass die Überschreitung.

Auch Ihre innere Schleife scheint nicht verwendet zu werden, aber wenn Sie versuchen, auf etwas in einem Ihrer Arrays mit dem ersten Wert von j zuzugreifen, werden Sie wahrscheinlich das gleiche Problem aus dem gleichen Grund stoßen.

+0

Wie kann ich j bei dieser Gelegenheit verwenden? Ich versuchte es nur auf bubblesort zu sortieren:/ – FILIaS

1

Die allerletzte Iteration der for-Schleife i entspricht PlayersNames.size() - 1. In der Zeile, in der der Fehler aufgetreten ist, rufen Sie results.get(i + 1) an, was zu results.get(PlayersNames.size()) führt.

1

paar Fehler, die ich sehen kann:

1)

i<PlayersNames.size() 

, was gut ist, aber dann verwenden Sie

i+1 

ÜBERALL (nicht nur in der if), so Wenn Sie das letzte Element erreichen, treffen Sie immer eine indexOutOfBoundsException.

Verringern Sie entweder den Bereich von i oder entfernen Sie die +1;

2) deklarieren Sie eine Variable

j

die Sie nie benutzen ...

3

können Sie verwenden Collections.sort(Pass ArrayList Here), Sie müssen nicht Ihre eigene Methode zu schreiben. Java bietet es an.

+0

Problem ist, dass ich nicht nur eine ArrayList sortieren möchte. Ich möchte es basierend auf den Ergebnissen Arraylist sortieren. Denken Sie nur daran, dass Spieler mit dem Würfeln und Spielernamen ihre Namen drehen. Was ich tun möchte ist, nicht nur ihre Namen zu sortieren, sondern ihre Namen nach ihrem Würfelspiel aufzulisten. thanx – FILIaS

1

Viele Menschen haben die richtigen Gründe angegeben.

Es gibt viele Möglichkeiten, dieses Programm zu korrigieren. einfachste ist äußere Schleife nur bis n-1 iterieren (wobei n die Größe des Array ist)

for (int i=0; i<PlayersNames.size()-1; i++) { 
0

Mit Karte wie:

Map <String, ImageIcon> 

kann zum Sortieren, nützlicher sein, anstatt mit zwei ArrayLists.

+0

aber wie kann ich Karte verwenden, wenn ich die 2 arrayLists auf anderen Fällen wünsche? : / – FILIaS

Verwandte Themen