2011-01-13 18 views
0

私は文字列(PlayersNames)とimageIcons(PlayersIcons)でArrayListをソートしようとしていますが、整数(結果)を持つ他のarrayListに格納されている値に基づいています。 ご覧のとおり、私はindexOutOfBoundsExceptionを取得しますが、なぜそれは理解できません。たぶん、朝の鳴き声は私に平凡なものを見させないでしょう。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

明らかに、結果リストの最後は外れていますが、sortPlayers()を呼び出すコードを投稿していないので、そのリストの大きさを知ることができません。 PlayersNamesと同じサイズですか?もしそうなら、あなたのループの最後の反復、i == PlayersNames.size() - 1のとき、results.get(i + 1)を呼び出そうとすると範囲外に出るでしょう。結果リスト。 –

答えて

5

ループがarrayListの最後に到達すると、リストの最後を過ぎて項目を取得しようとしています。このライン上:

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

I = 9の場合、10の項目でのArrayListで、results.getは(9)あなたのリストの最後の項目を提供します。 results.get(10)は存在しないものを取得しようとします。

1

最終的にiは、PlayersNames.size()-1の値を保持できます。 resultsPlayersNamesと同じサイズか、むしろPlayersNames.size() == results.size()と仮定しています。

これが本当であれば、最終的にあなたはresultsは、このようにはIndexOutOfBoundsExceptionがスローされ、保持しているよりも1以上であるresults中(results.get(i+1)を行うことによって)results.size()番目の要素、のために求めています。結果はNアイテムを保持している場合

がより簡潔に言った、その後、N番目の項目はインデックスN-1を使用してアクセスされますが、存在しないインデックスN、で項目にアクセスしようとしています。オーバーランを防ぐために

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

はにあなたの外側のループを変更してみてください。

また、内部ループは使用されていないようですが、最初の値jを使用して配列のいずれかにアクセスしようとすると、同じ理由で同じ問題が発生する可能性があります。

+0

どうすればこの機会にjを使うことができますか?私はbubblesortに基づいてそれをソートしようとしました:/ – FILIaS

1

forループの最後の反復、iPlayersNames.size() - 1に等しくなります。エラーが発生した行でresults.get(i + 1)と呼び、results.get(PlayersNames.size())と評価されます。私が見ることができるミスの

1

カップル:

1)

i<PlayersNames.size() 

)良いですが、その後、あなたがいない場合のみに(EVERYWHERE

i+1 

を使用するので、最後の要素に到達すると、常にindexOutOfBoundsExceptionが発生します。

iの範囲を小さくするか+1を削除してください。

2) あなたがCollections.sort(Pass ArrayList Here)を使用することができます

3

...あなたが使用しない変数

J

を宣言し、独自のメソッドを書く必要はありません。 Javaはそれを提供します。

+0

問題は、ArrayListだけをソートしたくないということです。私は結果arraylistに基づいてそれを並べ替えるしたい。結果は、プレイヤーがサイコロを振って自分の名前をプレイヤーの名前を変えたものだと思ってください。私がしたいのは、自分の名前だけを並べ替えるのではなく、名前のリストを自分のサイコロに合わせて並べ替えることです。おかげで – FILIaS

1

多くの人が正しい理由を示しています。

このプログラムを修正する方法はたくさんあります。

Map <String, ImageIcon> 

をより選別するために有用ではなくてもよい。 は、一つのみのようなマップを用い

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

(nはArrayListのサイズである)は、n-1までの外部ループを反復する簡単な2つのArrayListを使用します。

+0

しかし、私はマップを使用することができます私は両方の2つの配列リストを他の場合にしたいですか? :/ – FILIaS

関連する問題