У меня есть некий класс, который является оберткой над массивом. Этот класс называется хранилищем моих элементов. Итак, в этом классе есть массив моих элементов, и методы add
, replace
, delete
, которые занимаются добавлением, заменой и удалением соответственно. Проблема в методе delete
,- мне нужно найти элемент по значению id
(это значение есть у каждого элемента) и удалить его, потом сместить все элементы влево на один элемент.
public void delete(String id) {
for (int i = 0; i < items.length; i++) {
if (items[i].getId().equals(id))
this.items[i] = null;
}
System.arraycopy(items,position,items,position-1,1);
}
items - это массив элементов. У меня получилось довольно кривовато, может подскажет кто, что не так ?
Попробуйте так.
public void delete(String id) throws NoSuchElementException{
Item[] out = new Item[items.length - 1];
int index = IntStream.range(0, items.length).filter(i -> items[i].getId().equals(id)).findFirst().orElseThrow(NoSuchElementException::new);
System.arraycopy(items, 0, out, 0, index);
System.arraycopy(items, index + 1, out, index, items.length - index);
items = out;
}
P.S. возможно я немного напутал с индексами при копировании но логика такова : ищем в стриме индекс нашего элемента, потом в два приема копируем старый массив в новый "вырезая" удаляемый элемент.
P.P.S без стрима
public void delete(String id){
Item[] out = new Item[items.length - 1];
int index =-1;
for(int i=0;i<items.length;i++){
if(items[i].getId().equals(id)){
index=i;
break;
}
}
System.arraycopy(items, 0, out, 0, index);
System.arraycopy(items, index + 1, out, 0, items.length - index);
items = out;
}
delete,- мне нужно найти элемент по значению id (это значение есть у каждого элемента) и удалить его, потом сместить все элементы влево на один элемент.
Тогда у тебя скорее LinkedList а не массив или комбинированая стркутура [массив] -(указатель)->массив. А если у тебя
да, конечно он один, id это же уникальное поле у каждого элемента, то есть с таким id который передан в аргументе метода , есть только один элемент.
тогда у тебя скорее Map, где int это ID, но карта неупорядоченная и сдвиать всё вправо не получится.
А самый простой способ, зная какой будет максимальный id просто иметь лукап- массив objects[] = new Object[max_id] и добавлять objects[obj.id] = obj.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть программа, большую часть своей жизни она сидит в трее и должна иногда мигать иконкой, при двойном клике открывать вебкитМигает она или...
Почему вылетает приложениеНачинаю работать с sqlite, простой вывод данных бд в listView не работет - приложение просто вылетает
Не печатаемые символы в заголовке окна eclipse, на скриншотеЛокаль ru_RU