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


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

5 63

5 ответов:

размер массивов в 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

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

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

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

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

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

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

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

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

сохранить индекс первого "живого" элемента массива. Удаление (притворяясь, что удаляет) первый элемент становится O(1) время работы сложности.

альтернативный уродливый способ:

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