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);
}
}
Как вы объяснили, ваш participants
size
8, но вы пытаетесь получить 13-й и 14-й элемент. Как это возможно. Здесь ваша проблема.