Каков наилучший способ удалить первый элемент из массива?

У меня есть строковый массив (String[]), и мне нужно удалить первый элемент. Как я могу сделать это эффективно?

Ответ 1

Размер массивов в Java не может быть изменен. Итак, технически вы не можете удалить какие-либо элементы из массива.

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

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

Однако, я бы не предложил этот метод. Вы действительно должны использовать List<String>. Списки позволяют добавлять и удалять элементы из любого индекса. Это будет выглядеть примерно так:

List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item

Ответ 2

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

int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);

Обратите внимание, что если вы часто проводите такую ​​операцию, это может быть признаком того, что вы должны фактически использовать другую структуру данных, например. связанный список. Построение нового массива каждый раз является операцией O (n), которая может стать дорогой, если массив большой. Связанный список даст вам O (1) удаление первого элемента.

Альтернативная идея заключается не в том, чтобы удалить первый элемент вообще, а просто увеличить число, указывающее на первый индекс, который используется. Пользователи массива должны учитывать это смещение, но это может быть эффективным подходом. Класс Java String фактически использует этот метод для создания подстрок.

Ответ 3

Вы не можете сделать это вообще, не говоря уже о быстром. Массивы на Java являются фиксированными. Две вещи, которые вы можете сделать:

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

Вы можете использовать System.arraycopy для любого из них. Оба они O (n), поскольку они копируют все, кроме 1 элемента.

Если вы часто удаляете первый элемент, вместо этого используйте LinkedList. Для удобства вы можете использовать LinkedList.remove, который находится из интерфейса Queue. При LinkedList удаление первого элемента - O (1). Фактически, удаление любого элемента - O (1), когда у вас есть ListIterator в эту позицию. Однако доступ к произвольному элементу по индексу равен O (n).

Ответ 4

Сохраните индекс первого "живого" элемента массива. При удалении (при удалении) первый элемент становится операцией O(1).

Ответ 5

Подводя итог, метод быстрого связного списка:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);

Ответ 6

Альтернативный уродливый метод:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");