Как добавить элемент в массивы и индексы сдвига?

Мне нужно добавить элемент в Array, указав позицию и значение. Например, у меня есть Array

int []a = {1, 2, 3, 4, 5, 6};

после применения addPos (int 4, int 87) это должно быть

int []a = {1, 2, 3, 4, 87, 5};

Я понимаю, что здесь должен быть сдвиг индексов Array, но не вижу, как реализовать его в коде.

Ответ 1

Это должно сделать трюк:

public static int[] addPos(int[] a, int pos, int num) {
    int[] result = new int[a.length];
    for(int i = 0; i < pos; i++)
        result[i] = a[i];
    result[pos] = num;
    for(int i = pos + 1; i < a.length; i++)
        result[i] = a[i - 1];
    return result;
}

Где a - исходный массив, pos - это позиция вставки, а num - это число, которое нужно вставить.

Ответ 2

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

Ответ 3

Самый простой способ сделать это - использовать ArrayList<Integer> и использовать метод add(int, T).

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);

// Now, we will insert the number
list.add(4, 87);

Ответ 4

Я чувствую домашнюю работу, поэтому, возможно, ArrayList не будет разрешен (?)

Вместо поиска способа "смены индексов", возможно, просто создайте новый массив:

int[] b = new int[a.length +1];

Тогда

  • копии индексов формы массива подсчет с нуля до позиции вставки
  • ...
  • ...

//edit: копировать значения, конечно, а не индексы

Ответ 5

Вот квази-oneliner, который делает это:

String[] prependedArray = new ArrayList<String>() {
  {
    add("newElement");
    addAll(Arrays.asList(originalArray));
  }
}.toArray(new String[0]);

Ответ 6

Посмотрите commons. Он использует arrayCopy(), но имеет более хороший синтаксис. Тем, кто отвечает с помощью элементарного кода: если это не домашнее задание, этот тривиальный и интересный ответ - тот, который способствует повторному использованию. Тем, кто предлагает списки: возможно, читатели знают об этом и должны упоминаться проблемы производительности.

Ответ 7

Решение Jrad хорошее, но мне не нравится, что он не использует массивную копию. Internally System.arraycopy() выполняет собственный вызов, чтобы получить более быстрые результаты.

public static int[] addPos(int[] a, int index, int num) {
    int[] result = new int[a.length];
    System.arraycopy(a, 0, result, 0, index);
    System.arraycopy(a, index, result, index + 1, a.length - index - 1);
    result[index] = num;
    return result;
}

Ответ 8

org.apache.commons.lang3.ArrayUtils#add(T[], int, T) устарел в новых сообществах lang3, вместо этого вы можете использовать org.apache.commons.lang3.ArrayUtils#insert(int, T[], T...).

Устаревший этот метод был заменен вставкой (int, T [], T...) и может быть удален в будущей версии. Обратите внимание, что обработка нулевых массивов ввода отличается в новом методе: вставка X в нулевой массив приводит к null не X

Пример кода:

    Assert.assertArrayEquals
            (org.apache.commons.lang3.ArrayUtils.insert
            (4, new int[]{1, 2, 3, 4, 5, 6}, 87), new int[]{1, 2, 3, 4, 87, 5, 6});

Ответ 9

Попробуйте это

public static int [] insertArry (int inputArray[], int index, int value){
    for(int i=0; i< inputArray.length-1; i++) {

        if (i == index){

            for (int j = inputArray.length-1; j >= index; j-- ){
                inputArray[j]= inputArray[j-1];
            }

            inputArray[index]=value;
        }

    }
    return inputArray;
}

Ответ 10

public class HelloWorld{

     public static void main(String[] args){
        int[] LA = {1,2,4,5};
        int k = 2;
        int item = 3;
        int j = LA.length;
        int[] LA_NEW = new int[LA.length+1];


       while(j >k){
            LA_NEW[j] = LA[j-1];
            j = j-1;
        }
        LA_NEW[k] = item;
        for(int i = 0;i<k;i++){
            LA_NEW[i] = LA[i];
        }
        for(int i : LA_NEW){
            System.out.println(i);
        }
     }
}

Ответ 11

int[] b = new int[a.length +1];
System.arraycopy(a,0,b,0,4); 
//System.arraycopy(srcArray, srcPosition, destnArray, destnPosition, length)
b[4]=87;
System.arraycopy(a,4,b,5,2);

b массив будет создан как {1, 2, 3, 4, 87, 5,6};

Ответ 12

System.arraycopy более результативен, но сложнее получить право из-за вычислений индексов. Лучше придерживаться jrad-ответа или ArrayList, если у вас нет требований к производительности.

public static int[] insert(
    int[] array, int elementToInsert, int index) {
  int[] result = new int[array.length + 1];
  // copies first part of the array from the start up until the index
  System.arraycopy(
      array /* src */,
      0 /* srcPos */,
      result /* dest */,
      0 /* destPos */,
      index /* length */);
  // copies second part from the index up until the end shifting by 1 to the right
  System.arraycopy(
      array /* src */,
      index /* srcPos */,
      result /* dest */,
      index + 1 /* destPos */,
      array.length - index /* length */);
  result[index] = elementToInsert;
  return result;
}

И проверка JUnit4 для проверки работает как ожидалось.

@Test
public void shouldInsertCorrectly() {
  Assert.assertArrayEquals(
      new int[]{1, 2, 3}, insert(new int[]{1, 3}, 2, 1));
  Assert.assertArrayEquals(
      new int[]{1}, insert(new int[]{}, 1, 0));
  Assert.assertArrayEquals(
      new int[]{1, 2, 3}, insert(new int[]{2, 3}, 1, 0));
  Assert.assertArrayEquals(
      new int[]{1, 2, 3}, insert(new int[]{1, 2}, 3, 2));
}