【问题标题】:Sorting ArrayList - IndexOutOfBoundsException -Java排序 ArrayList - IndexOutOfBoundsException -Java
【发布时间】:2011-01-13 05:02:22
【问题描述】:

我正在尝试根据我存储在另一个带有整数(结果)的 arrayList 中的值,对带有字符串(PlayersNames)和 imageIcons(PlayersIcons)的 ArrayList 进行排序。 如您所见,我得到一个 indexOutOfBoundsException 但我不明白为什么。也许晨曦让我看不到平淡的事物。

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);
                }
            }
        }
    }

【问题讨论】:

  • 很明显,您将超出结果列表的末尾,但您尚未发布调用 sortPlayers() 的代码,因此我们无法确定该列表应该有多大。它与 PlayersNames 的大小相同吗?如果是这样,那么循环的最后一次迭代,当 i == PlayersNames.size() - 1 时,将导致你超出界限,因为尝试调用 results.get (i + 1) 对结果列表。

标签: java sorting arraylist


【解决方案1】:

当循环到达 arrayList 的末尾时,您正试图让一个项目超过列表的末尾。在这一行:

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

如果 i=9,arrayList 有 10 个项目,results.get(9) 将给你列表中的最后一个项目。 results.get(10) 将尝试获取不存在的东西。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 问题是我不想只对 ArrayList 进行排序。我想根据结果数组列表对其进行排序。试想一下,结果就是玩家通过掷骰子和玩家名字而得到的结果。我想做的不仅仅是对他们的名字进行排序,而是根据他们的掷骰子来排序他们的名字。谢谢
    【解决方案3】:

    最终i 可以保存PlayersNames.size()-1 的值。我只能假设results 的大小与PlayersNames 相同,或者更确切地说是PlayersNames.size() == results.size()

    如果这是真的,那么最终你会在results 中请求results.size()-th 元素(通过执行results.get(i+1)),这比results 持有的元素多一个,因此会引发IndexOutOfBoundsException .

    更简洁地说,如果结果包含 N 个项目,则使用索引 N-1 访问第 N 个项目,但您正在尝试访问索引 N 处的项目,该项目不存在。

    尝试将外部循环更改为:

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

    防止溢出。

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

    【讨论】:

    • 在这种情况下我如何使用 j?我只尝试根据bubblesort对其进行排序:/
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我能看到的几个错误:

      1)

      i<PlayersNames.size()
      

      这很好,但是你使用

      i+1
      

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

      要么缩小i的范围,要么去掉+1;

      2) 你声明一个变量

      j

      你从不使用...

      【讨论】:

        【解决方案6】:

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

        有很多方法可以纠正这个程序。 最简单的方法是只迭代外循环直到 n-1(其中 n 是 ArrayList 的大小)

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

        【讨论】:

          【解决方案7】:

          像这样使用地图:

          Map <String, ImageIcon>
          

          可能对排序更有用,而不是使用两个 ArrayList。

          【讨论】:

          • 但是当我在其他情况下想要两个 arrayLists 时如何使用 map? ://
          猜你喜欢
          • 2016-03-22
          • 1970-01-01
          • 2018-12-03
          • 1970-01-01
          • 1970-01-01
          • 2016-04-11
          • 2014-06-25
          • 1970-01-01
          相关资源
          最近更新 更多