Сортировка ArrayList - IndexOutOfBoundsException -Java - PullRequest
0 голосов
/ 13 января 2011

Я пытаюсь отсортировать 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);
                }
            }
        }
    }

Ответы [ 7 ]

5 голосов
/ 13 января 2011

Когда цикл доходит до конца arrayList, вы пытаетесь получить элемент за концом списка.В этой строке:

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

Если i = 9, с arrayList с 10 элементами, results.get (9) выдаст вам последний элемент в списке.results.get (10) попытается получить то, чего не существует.

3 голосов
/ 13 января 2011

Вы можете использовать Collections.sort(Pass ArrayList Here), вам не нужно писать свой собственный метод.Java это обеспечивает.

1 голос
/ 13 января 2011

Многие люди дали правильные причины.

Есть много способов исправить эту программу. Самый простой - это повторять внешний цикл только до n-1 (где n - размер ArrayList)

    for (int i=0; i<PlayersNames.size()-1; i++) {
1 голос
/ 13 января 2011

Пара ошибок, которые я вижу:

1)

i<PlayersNames.size()

, что хорошо, но тогда вы используете

i+1

ВЕЗДЕ (не только весли), поэтому, когда вы достигнете последнего элемента, вы всегда попадете в исключение indexOutOfBoundsException.

Либо уменьшите диапазон i, либо уберите +1;

2) вы объявите переменную

j

, которые вы никогда не используете ...

1 голос
/ 13 января 2011

Самая последняя итерация цикла for, i будет равна PlayersNames.size() - 1.На линии, где произошла ошибка, вы звоните results.get(i + 1), что оценивается как results.get(PlayersNames.size()).

1 голос
/ 13 января 2011

В конечном итоге i может содержать значение PlayersNames.size()-1.Я могу только предположить, что results имеет тот же размер, что и PlayersNames, а точнее PlayersNames.size() == results.size().

. Если это так, то в конечном итоге вы запрашиваете results.size() -й элемент (выполнение results.get(i+1)) в results, что на единицу больше, чем удерживается results, поэтому генерируется исключение IndexOutOfBoundsException.

Говоря более кратко, если результаты содержат N элементов, N -й элемент доступен с помощью индекса N-1, но вы пытаетесь получить доступ к элементу с индексом N, который не существует.

Попробуйте изменить внешний цикл на:

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

, чтобы предотвратить переполнение.

Кроме того, ваш внутренний цикл не используется, но если вы пытаетесь получить доступ к чему-либов одном из ваших массивов, используя первое значение j, вы, вероятно, столкнетесь с той же проблемой по той же причине.

0 голосов
/ 13 января 2011

Использование карты, как:

Map <String, ImageIcon>

может быть более полезным для сортировки, чем использование двух ArrayLists.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...