【问题标题】:Java Android : Comparator gets OutOfBoundsExceptionJava Android:比较器获取 OutOfBoundsException
【发布时间】:2013-12-08 17:48:10
【问题描述】:

我不是真正的专家,无法弄清楚为什么它会越界

public class ParticipantIndexComparator implements Comparator<Integer> {
    final List<Participant> participants;       
    public ParticipantIndexComparator(ArrayList<Integer> numbersToSort) {
        Log.d("MyLog","numbersToSort.size=" + numbersToSort.size());

        participants = new ArrayList<Participant>();

        for (int i=0;i<numbersToSort.size();i++) {     
            participants.add(i, competition.participant.get(numbersToSort.get(i)));
            participants.get(i).comparator = numbersToSort.get(i);
        }

        Log.d("MyLog","participants.size="+participants.size());
    }

    @Override
    public int compare(Integer i1, Integer i2) {
        Log.d("MyLog","in compare: participants.size=" + participants.size() + "i1=" + i1 + " i2=" + i2);
        long l1 = participants.get(i1).kpTime.get(kpSelected); 
        long l2 = participants.get(i2).kpTime.get(kpSelected);
        return Long.valueOf(l1).compareTo(Long.valueOf(l2));
    }
}

好吧,我的第一个日志显示participants.size=8. 第二个日志显示participants.size=8. 第三个日志显示我participants.size=8, i1=13 i2=14.

为什么???为什么我每一步都检查尺寸时是 13 和 14,但总是 8 - 我不明白。我不是专家,自己也搞不清楚

这里是堆栈跟踪:

11-24 02:41:23.612: E/AndroidRuntime(4802): java.lang.IndexOutOfBoundsException: Invalid index 14, size is 8
11-24 02:41:23.612: E/AndroidRuntime(4802):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at java.util.ArrayList.get(ArrayList.java:304)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at ru.maximhasanov.skitimer.FinalProtocolActivity$ParticipantIndexComparator.compare(FinalProtocolActivity.java:311)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at ru.maximhasanov.skitimer.FinalProtocolActivity$ParticipantIndexComparator.compare(FinalProtocolActivity.java:1)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at java.util.TimSort.countRunAndMakeAscending(TimSort.java:320)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at java.util.TimSort.sort(TimSort.java:185)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at java.util.TimSort.sort(TimSort.java:169)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at java.util.Arrays.sort(Arrays.java:2038)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at java.util.Collections.sort(Collections.java:1891)
11-24 02:41:23.612: E/AndroidRuntime(4802):     at ru.maximhasanov.skitimer.FinalProtocolActivity.sortNumbers(FinalProtocolActivity.java:213)

【问题讨论】:

  • 能否请您澄清您的日志条目。如果您的第一个日志字符串是numbersToSort.size=,您的第一个日志条目怎么可能是participants.size=8.?您应该逐步调试以确定您的代码何时停止执行应执行的操作。

标签: java android comparator


【解决方案1】:

正如您所解释的,您的 participants size8 但您正在尝试获得 13th14th 元素。这怎么可能。这是你的问题。

【讨论】:

  • 是的,但是这些 13 和 14 数字从何而来?我无法从我在这里附上的代码中理解 - 比较器怎么可能采用第 13 和第 14 个元素?
【解决方案2】:

好的,我要试一试。我想我有点了解你的情况。

正如我在评论中所说,我认为numbersToSort 包含您希望按特定kpTime 排序的competition.participant 子集的数字(基本上是索引)列表。

如果这是正确的,那么您获得OutOfBoundsException 的原因是因为您的numbersToSort 包含大于participants 大小的数字(它们是索引),因为participants 是一个子集一个更大的列表。

我相信你应该做的是在FinalProtocolActivity sortNumbers方法中创建你的ArrayList&lt;Participant&gt; participants,然后使用以下Comparator调用Collections.sort()

public class ParticipantIndexComparator implements Comparator<Participant>
{
    public int compare(Participant p1, Participant p2)
    {
        Long time1 = p1.kpTime.get(kpSelected);
        Long time2 = p2.kpTime.get(kpSelected);
        return Long.valueOf(time1).compareTo(time2);
    }
}

【讨论】:

  • 好吧,谢谢,它奏效了。我必须将我的 ArrayList 索引排序为 ArrayList 对象,这些对象保留需要排序的时间值。所以我在我的对象中存储了一个额外的初始索引值,按照你的建议对对象进行了排序,并制作了另一个 ArrayList 的索引,我从那个额外的值中获取了 :))) 这是一个疯狂的方案,但现在一切正常。 :) 好吧,我还是不明白为什么它排在第 13 和第 14 位。
猜你喜欢
  • 2012-08-02
  • 2013-12-08
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2018-11-27
  • 2020-01-26
相关资源
最近更新 更多