У мене є масив рядків ( 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), як тільки ви потрапите в ListIterator
це положення. Однак доступ до довільного елемента за індексом - O (n).
Альтернативний потворний метод:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");