Java Android: Comparator получает исключение OutOfBoundsException

Я на самом деле не эксперт и не могу понять, почему это выходит за рамки

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)

2 ответа

Решение

Хорошо, я сделаю это. Я думаю, что у меня есть понимание вашей ситуации.

Как я уже сказал в своем комментарии, я думаю, что numbersToSort содержит список чисел (по существу индексов) подмножества competition.participant что вы хотите отсортировать по конкретному kpTime,

Если это правильно, то причина, по которой вы получаете OutOfBoundsException потому что твой numbersToSort содержит числа (которые являются индексами), которые больше, чем размер participants, как participants это подмножество большего списка.

Я верю, что вы должны сделать это создать ArrayList<Participant> participants в sortNumbers метод FinalProtocolActivity, а затем позвоните Collections.sort() на это со следующим Comparator:

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

Как вы объяснили, ваш participantssize 8, но вы пытаетесь получить 13-й и 14-й элемент. Как это возможно. Здесь ваша проблема.

Другие вопросы по тегам