Метод Delete. Обертка над массивом. Неверный алгоритм

227
08 февраля 2018, 16:55

У меня есть некий класс, который является оберткой над массивом. Этот класс называется хранилищем моих элементов. Итак, в этом классе есть массив моих элементов, и методы 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 - это массив элементов. У меня получилось довольно кривовато, может подскажет кто, что не так ?

Answer 1

Попробуйте так.

 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;
}
Answer 2

delete,- мне нужно найти элемент по значению id (это значение есть у каждого элемента) и удалить его, потом сместить все элементы влево на один элемент.

Тогда у тебя скорее LinkedList а не массив или комбинированая стркутура [массив] -(указатель)->массив. А если у тебя

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

тогда у тебя скорее Map, где int это ID, но карта неупорядоченная и сдвиать всё вправо не получится.

А самый простой способ, зная какой будет максимальный id просто иметь лукап- массив objects[] = new Object[max_id] и добавлять objects[obj.id] = obj.

READ ALSO
Взаимодействие php и java (не js)

Взаимодействие php и java (не js)

Есть программа, большую часть своей жизни она сидит в трее и должна иногда мигать иконкой, при двойном клике открывать вебкитМигает она или...

189
Как записать данные из переменной в файл?

Как записать данные из переменной в файл?

Как записать данные из double probinres в FILENAME?

210
Вылетает приложение. Работа с sqlite

Вылетает приложение. Работа с sqlite

Почему вылетает приложениеНачинаю работать с sqlite, простой вывод данных бд в listView не работет - приложение просто вылетает

197
Не печатаемые символы в заголовке окна eclipse (DBeaver)

Не печатаемые символы в заголовке окна eclipse (DBeaver)

Не печатаемые символы в заголовке окна eclipse, на скриншотеЛокаль ru_RU

312