У меня есть строковый массив ( String[]), и мне нужно удалить первый элемент. Как я могу сделать это эффективно?
У меня есть строковый массив ( String[]), и мне нужно удалить первый элемент. Как я могу сделать это эффективно?
Ответы:
Размер массивов в 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
ArrayList- это O (n).
ArrayList, но не для LinkedList.
Arrays.copyOfRange()предназначен для API9 +
Самый простой способ, вероятно, следующий: вам в основном нужно построить новый массив, который на один элемент меньше, а затем скопировать элементы, которые вы хотите сохранить, в правильные позиции.
int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
Обратите внимание: если вы обнаружите, что часто выполняете такие операции, это может быть признаком того, что вы действительно должны использовать другой тип структуры данных, например связанный список. Создание нового массива каждый раз - это операция O (n), которая может стать дорогостоящей, если ваш массив большой. Связанный список даст вам O (1) удаление первого элемента.
Альтернативный вариант - вообще не удалять первый элемент, а просто увеличивать целое число, указывающее на первый используемый индекс. Пользователи массива должны будут учитывать это смещение, но это может быть эффективным подходом. Класс Java String фактически использует этот метод для внутренних целей при создании подстрок.
Arrays.copyOfRange()является.
Вы вообще не можете этого сделать, не говоря уже о том, чтобы быстро. Массивы в Java имеют фиксированный размер. Вы можете сделать две вещи:
Вы можете использовать System.arraycopyдля любого из них. Оба они O (n), поскольку они копируют все, кроме 1 элемента.
Если вы будете часто удалять первый элемент, подумайте об использовании LinkedListвместо него. Вы можете использовать LinkedList.remove, что есть в Queueинтерфейсе, для удобства. С LinkedList, удаление первого элемента - O (1). Фактически, удаление любого элемента - это O (1), если у вас есть a ListIteratorв этой позиции. Однако доступ к произвольному элементу по индексу - O (n).
Альтернативный уродливый метод:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");