Chvalov
@Chvalov

Удаление данных из массива, в чем подвох?

Пишу сайт на спринге, но не могу удалить данные из массива, мой код:
Контроллер:
@RestController
public class IpController {

    @Autowired
    private IpService ipService;

    @DeleteMapping("/ip/{id}")
    public void deleteIp(@PathVariable Integer id) {
        ipService.deleteIp(id);
    }

Сервис:
@Service
public class IpService {
   private List<Ip> ipList = new ArrayList<>(Arrays.asList(
            new Ip(0,3002235620L,true,false,Timestamp.valueOf("2007-12-23 09:01:06")),
            new Ip(1,3232235620L,false,true, Timestamp.valueOf("2016-12-23 09:01:06")),
            new Ip(2,4294967295L,true,false, Timestamp.valueOf("2017-10-08 17:24:06")),
            new Ip(3,3294967295L,true,false, Timestamp.valueOf("2017-11-08 17:24:06"))
            ));

    public void deleteIp(Integer id) {
        //ipList.remove(id);
        ipList.removeIf(i -> i.getId().equals(id)); // РАБОТАЕТ !!!!
    }


ipList.remove(id); - так ничего не удаляет, почему ?
ipList.remove(2); - удаляет, только если отправлять повторно будет удалять остальные данные

Как быть в такой ситуации и что использовать в итоге ?
// В дальнейшем все это дело будет работать с БД
  • Вопрос задан
  • 397 просмотров
Решения вопроса 1
mitaichik
@mitaichik
Смотри: у List есть 2 метода remove:

boolean remove(Object o);
E remove(int index);

Первый удаляет по объекту. Грубо говоря, он ищет в списке передаваемый объект, и если находит - удаляет его.
Второй удаляет по индексу - то есть удаляет объект с индексом index.

Обрати внимание на тип параметра: у первого это Object, у второго - скалярный int.

В ipList.remove(id) ты передаешь переменную типа Integer (который, в свою очередь, наследуется от Object). Таким образом java вызывает первый метод. Он пытается найти этот объект в списке, а его там нет - у тебя же там Ip, и, в итоге, ничего не удаляет.

Тебе надо приводить твой Integer к int ( с помощью id.intValue() или (int) id). Тогда java вызовет второй метод, который удаляет по индексу.

Но! Скорее всего, в запросе ты будешь передавать не индекс, а иммено id класса Ip. Поэтому, на самом деле, решение с ipList.removeIf(i -> i.getId().equals(id)); является самым правильным. Ну, или использовать Map, как сказали выше.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Atlllantis
Судя по всему, Вы пытаетесь удалить данные из массива по идентификатору (присвоенному вами).
Так вот, ipList.remove(2); - здесь (да и везде в массивах на java) двойка (или любая цифра) - это индекс, т.е. номер записи которую и нужно удалить.
Опять же, если я правильно понял, чего Вы хотите добиться, то Вам нужно использовать map, а не array.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы