2011-01-13 75 views
0

我想基于我存储在其他arrayList与整数(结果)值的字符串(PlayersNames)和imageIcons(PlayersIcons)排序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的大小相同吗?如果是这样,那么循环的最后一次迭代,当我== PlayersNames.size() - 1,会导致你超出界限,因为试图调用results.get(i + 1)将是一个太多结果列表。 – 2011-01-13 05:08:57

回答

5

当循环到达arrayList的末尾时,试图让一个项目超出列表的末尾。在这条线:

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

如果我= 9,与10个项目的ArrayList中,results.get(9)会给你在列表的最后一个项目。 results.get(10)将尝试获取不存在的内容。

1

最终i可以保持值为PlayersNames.size()-1。我只能假设resultsPlayersNames具有相同的尺寸,或者更确切地说是PlayersNames.size() == results.size()

如果这是真的,那么最终你问的results.size()个元素(做results.get(i+1))在results,比results一个多持有,从而IndexOutOfBoundsException异常被抛出。

说得更简洁,如果结果持有ñ项目,那么ñ个项目使用索引N-1访问,但是你想在指数N,不存在访问该项目。

试着改变你的外环到:

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

防止溢出。

此外,您的内部循环似乎未被使用,但如果您尝试使用第一个值j访问某个数组中的某些内容,则出于同样的原因,您可能会遇到同一问题。

+0

我该如何在这种情况下使用j?我只尝试根据bubblesort对其进行排序:/ – FILIaS 2011-01-13 12:59:00

1

for循环的最后一次迭代,i将等于PlayersNames.size() - 1。在发生错误的行上,您正在调用results.get(i + 1),其计算结果为results.get(PlayersNames.size())

1

夫妇错误的,我可以看到:

1)

i<PlayersNames.size() 

是好的,但你使用

i+1 

EVERYWHERE(不仅当),所以当你到达最后一个元素时,你总会遇到一个indexOutOfBoundsException异常。

减小i的范围或删除+1;

2) 声明变量

Ĵ

,你从来没有使用...

3

您可以使用Collections.sort(Pass ArrayList Here),你不需要写你自己的方法。 Java提供它。

+0

问题是我不想仅排序ArrayList。我想根据结果列表进行排序。只要认为结果就是玩家在掷骰子和玩家名字时的转向。我想要做的不是按照他们的骰子滚动来排序他们的名字,而是他们的名字列表。 thanx – FILIaS 2011-01-13 12:55:43

1

很多人都给出了正确的理由。

有很多方法可以纠正这个程序。 最简单的一种是进行迭代外环仅直到n-1个(其中,n是该ArrayList的大小)使用地图等

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

Map <String, ImageIcon> 

可以是用于排序的更多有用的,而不是使用两个ArrayLists。

+0

但我怎么能使用地图,当我想在其他情况下2 arrayLists? :/ – FILIaS 2011-01-13 12:58:04