2013-11-13 2 views
1

Эта функция должна добавить элемент по выбранному индексу и нажать все остальные элементы массива вниз. Так, например, у меня есть следующий массив:Вставка элементов по определенному индексу в массиве - исключение IndexOutOfBounds

[0] = zero 
[1] = one 
[2] = two 

, если добавить еще один элемент с индексом 0 называется NEWZERO, массив должен выглядеть следующим образом:

[0] = NEWZERO 
[1] = zero 
[2] = one 
[3] = two 

, но в настоящее время я получая исключение IndexOutOfBounds, и он не работает, хотя мой массив намного больше, чем всего 3 элемента.

P.S. Я не хочу использовать встроенную библиотеку ArrayList, которая автоматически сделает это за вас.

public void insert(int i, String s) { 

if (array[i] == null) { 
    array[i] = s; //Need to add feature that instantly puts the element at the first available spot on the list. 
} else { 
    for (int j = i; j < array.length; j++) { //Can't use >= i 
     array[j + 1] = array[j]; //THIS IS WHERE I GET THE ERROR. 

     if (j == array.length - 1) { 
      break; 
     } 
    } 
    array[i] = s; 
    extendArray(); //If an element is inserted properly, the array becomes array.length + 1 

Я не получаю ошибку, потому что в моем массиве нет места. Даже если у меня есть массив с 20 элементами, и я работаю всего с 3, я все равно получаю ошибку OutOfBounds. Вот мой метод расширения массива, когда пользователь исчерпывает пространство массива.

public void extendArray() { 
    String[] items2 = new String[items.length + 1]; 
    for (int j = 0; j < items.length; j++) { 
     items2[j] = items[j]; 
    } 
    items = items2; 
} 

ответ

3

Когда вы инициализируете массив, он существует от 0 до длины-1.

в коде

for (int j = i; j < array.length; j++) { //Can't use >= i 
    array[j + 1] = array[j]; //THIS IS WHERE I GET THE ERROR. 

вы пытаетесь сохранить значения массива [длина], что находится вне границ массива.

так изменить для к

for (int j = i; j < array.length - 1; j++) { //Can't use >= i 
    array[j + 1] = array[j]; 
1

Когда j достигает array.length-1 в цикле, array[j + 1] находится вне границ.

Чтобы это исправить, изменить условие останова (и избавиться от break, так как это совершенно не нужно):

for (int j = i; j < array.length - 1; j++) { 
    array[j + 1] = array[j]; 
} 

Наконец, вы можете заменить весь цикл с одним вызовом System.arraycopy().

1

Когда J Виль достигнет в конце концов, J + 1 будет вне границы и вызвать arrayIndexoutOfBoundException

Решение:

Измените цикл, как показано ниже

for (int j = i; j < array.length - 1; j++) { //Can't use >= i 
array[j + 1] = array[j]; 
} 
1

Вы уже есть условие для j в цикле, так зачем вам второму? Просто используйте

for (int j = i; j < array.length - 1; j++) { //Can't use >= i 
    array[j + 1] = array[j]; 
} 
1

Попробуйте это исправить

for (int j = i; j < array.length - 1; j++) { //Can't use >= i 
     array[j + 1] = array[j]; 
    } 

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

Смежные вопросы