Метод, который принимает массив int, индекс int и значение int

#java #arrays

#java #массивы

Вопрос:

Итак, проблема немного сложная для новичка вроде меня, поэтому я надеюсь, что вы сможете игнорировать мои ошибки.

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

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

Статический метод должен быть назван:

 addAtIndex( int [] a, int value, int index) 
  

и выполните следующее:

  • Если последнее место в массиве равно 0 или пусто, и я хочу поместить новое целочисленное значение в одно из уже занятых мест, мне нужно переместить каждый элемент вправо и оставить это место свободным, чтобы иметь возможность это сделать.

  • Если последнее пространство уже занято целочисленным значением, мне нужно «изменить размер» массива и освободить больше места, чтобы я мог продолжать вводить больше целочисленных значений. Я знаю, что вы не можете изменить размер массива и тем более сохранить все элементы нетронутыми, поэтому мне нужно создать массив большего размера, чтобы сделать это.

Я программирую на Java менее двух месяцев, поэтому нахожу это довольно сложным.

Мне удалось создать пустой массив, и я ввел в массив разные числовые значения с заданными параметрами. Все это было сделано в public static void main, а не в методе. Кажется, я не могу сделать это в методе, особенно я понятия не имею, как я могу переместить все в массиве вправо.

 import java.util.Arrays;
import java.util.Scanner;

public class Array{
  public static void main (String args []){

     Scanner input = new Scanner(System.in);
     int [] array   = new int[10];

    for (int x = 0; x <= 9; x  ){
     int index = input.nextInt();
     int value    = (int)(Math.random()*50);

      //move elements below insertion point.
    for (int i = array.length-1; i > index; i--){
        array[i] = array[i-1];
       }
       //insert new value
        array[index] = value;
      }
      System.out.println(Arrays.toString(array));
   }
}
  

Это, конечно, далеко от того, что учитель хочет, чтобы я сделал. То, что я здесь делаю, это просто создание массива, ввод случайных целых чисел в выбранные мной индексы и распечатка его. Мне нужна некоторая помощь.

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

1. Дополнено примерами и небольшим рефакторингом.

2. Кстати, при любых сомнениях просто спросите.

Ответ №1:

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

Помните, что у int[] массива не может быть нулей. Итак, я принял «пустое» значение равным нулю.
Следите за комментариями!

 static int[] addAtIndex(
        final int[] array,
        final int value,
        final int index) {
    if (array == null || array.length == 0) {
        // We cannot do anything.
        // Simply return to the caller
        return array;
    }

    // This is the array reference holder
    int[] localArray = array;

    // Get the last element of the array
    final int last = localArray[localArray.length - 1];

    // Is the last element 0? Remember an int array cannot contain nulls
    if (last == 0) {
        if (array[index] != 0) {
            // We need to shift everything to the right
            // to give space to the new element
            shiftRight(localArray, index);
        }
    } else {
        // Create a bigger array of length = actualLength   1
        // and assign it to the reference holder
        localArray = new int[array.length   1];

        // Copy the array elements to the new array, leaving a space
        // for the new element
        copyArrayAndLeaveSpace(index, array, localArray);
    }

    // Assign the new value
    localArray[index] = value;

    // Return the modified array reference
    return localArray;
}

static void shiftRight(
        final int[] array,
        final int index) {
    System.arraycopy(array, index, array, index   1, array.length - index - 1);
}

static void copyArrayAndLeaveSpace(
        final int index,
        final int[] array,
        final int[] newArray) {
    System.arraycopy(array, 0, newArray, 0, index);
    System.arraycopy(array, index, newArray, index   1, array.length - index);
}
  

Использование

 final int[] nums = {1, 2, 3, 4, 5, 6, 8, 9, 0};
final int[] result = addAtIndex(nums, 7, 4);
  

Вывод: [1, 2, 3, 4, 7, 5, 6, 8, 9]


 final int[] nums = {1, 2, 3, 4, 5, 6, 8, 9, 1};
final int[] result = addAtIndex(nums, 7, 4);
  

Вывод: [1, 2, 3, 4, 7, 5, 6, 8, 9, 1]