Я хочу добавить элемент в массив в определенной позиции, не уменьшая его размер, я попробовал это, но это показывает (исключение OutOfBoundsException)

#java #arrays

Вопрос:

 import java.util.Scanner;

public class AddElementToSpecificPosition {

    private static  Scanner scanner = new Scanner(System.in);


    public static void main(String[] args) {

        int[]  array =arrayDetails();
        scanner.nextLine();
        System.out.println("Enter the position for the element r");
        int position = scanner.nextInt();
        System.out.println("Enter the  element r");
        int element = scanner.nextInt();
        addElementToSpecificPositoin(array,position,element);

    }

    //getting details form user for arry
    private static int [] arrayDetails() {

        System.out.println("Enter the length for the array r");
        int length = scanner.nextInt();
        scanner.nextLine();
        int [] intArray =  new int[length];
        System.out.println("Enter the numbers for the array r");
        for(int i=0; i<intArray.length; i  ) {
            intArray[i] = scanner.nextInt();
        }
        return intArray;
    }

    //trying to add an element to specific position

    private static void addElementToSpecificPositoin(int[] array, int position, int element) {
        int lastIndexValue = array[array.length-1];
        
        for (int i=array.length-1; i>position-1 ; i-- ) {
            array[i]=array[i-1];
        }
        array[position-1] = element;
        int addedPosition = array.length ;
        int [] newArray = new int[addedPosition 1];
        for (int i =0; i<newArray.length; i  ) {
            newArray[i] = array[i]; 
        }
        
        newArray[addedPosition] = lastIndexValue;
        
        for (int j =0; j<newArray.length; j  ) {
            System.out.println(newArray[j]);
        }


    }

}
 

Комментарии:

1. Если вы сможете объяснить, что вы делаете для каждой строки в своем addElementToSpecificPositoin , вы, возможно, сможете найти свою проблему. Также отладчик может помочь вам точно показать, что происходит в этом методе во время его выполнения и где именно вы попали в исключение.

Ответ №1:

Массивы имеют фиксированный размер, а java передается по значению. Передача переменной массива никогда не будет назначена этой переменной.

 private static int[] insert(int[] array, int position, int element) {
   int[] largerArray = Arrays.copyOf(array, array.length   1);
   System.arraycopy(largerArray, position, largerArray, position   1,
       array.length - position);
   largerArray[position] = element;
   return largerArray;
}

array = insert(array, 13, 42);
 

Выше используется класс Arrays с хорошими служебными функциями. И System.arraycopy является быстрой функцией для копирования фрагментов массива. Он также имеет дело с перекрывающимися срезами.

Вам нужно назначить переменной переданного массива результирующий массив большего размера.

Ответ №2:

array это размер X. Что бы это ни было, давайте назовем его X. Тогда вы делаете:

 int addedPosition = array.length;
int[] newArray = new int[addedPosition   1];
 

Другими словами, newArray имеет размер X 1. Затем вы проходите цикл от 0 до newArray.length 1 и решаете array[i] для каждого i. Это, конечно, означает array[X] , что решена несуществующая запись.

Вместо того, чтобы спрашивать об этом, вам следует потратить немного времени и научиться отлаживать. Это просто! Все, что вы действительно делаете, это выясняете, что должна делать строка кода (просто глядя на нее и в основном «будучи компьютером». Используйте ручку и бумагу, если хотите), затем запустите код строка за строкой и убедитесь, что код действительно делает то, что вы считаете нужным.

Если, продумав это строчку за строчкой и проработав, вы поймете, что код не тот, что вы хотели: отлично, вы нашли ошибку. Исправьте это и продолжайте применять этот процесс. В противном случае вы поймете, когда то, что на самом деле делает код, не соответствует тому, что вы думали. Отладчики очень помогают при этом, но также может помочь множество System.out.println инструкций. Вы бы поняли это, как только поняли, что, например, в конечном итоге запускается пример ввода массива размером 4 newArray[4] = array[4] .