Удаление элемента из списка работает не так, как ожидалось

#java #string #arraylist

#java #строка #arraylist

Вопрос:

У меня есть ArrayList строковых массивов, который добавляется примерно так:

 List<String[]> data = new ArrayList<>();
data.add(new String[] {var, lex, valor});
  

При попытке стереть один из массивов строк вывод false по какой-то причине. Вот как я его удаляю:

 data.remove(new String[] {var, lex, valor});
  

Я также пытался удалить с помощью position, метод выглядит следующим образом:

 public void eliminarPos(String var, String lex, String valor, Integer ii) {
    boolean uno = data.remove(ii);
    System.out.println(uno);
}
  

Результат для приведенного выше метода false . Есть ли какой-либо способ успешно удалить массив строк из ArrayList?

Комментарии:

1. удаление по позиции должно работать. Вы используете правильный индекс? возвращаемым значением будет удаленный массив

2. Я бы не ожидал, что первый сработает. Я бы ожидал, что второе сработает. Покажите нам код для второго.

3. @LouisWasserman второй — это public void eliminarPos(String var, String lex, String valor, Integer ii) { boolean uno=data.remove(ii); System.out.println(uno); } вывод false

4. Не используйте заглавную Integer букву. Используйте int .

5. компилируется ли он? о .. только что понял, что list.remove() принимает объект вместо общего типа

Ответ №1:

Если вы посмотрите на Javadocs, вы увидите, что существует 2 разных перегруженных метода для remove . Один принимает объект, другой — примитивное целое число в качестве позиции:

remove

public E remove(int index)

Удаляет элемент в указанной позиции в этом списке. Сдвигает все последующие элементы влево (вычитает единицу из их индексов).

Приведенное выше принимает примитивное целое число, приведенное ниже принимает объект:

remove

public boolean remove(Object o)

Удаляет первое вхождение указанного элемента из этого списка, если он присутствует. Если список не содержит элемента, он остается неизменным…

Причина, по которой вы видите false , заключается в том, что вы предоставляете класс-оболочку primitive int . Integer является объектом, поэтому Java использует метод, наиболее похожий на то, как вы его вызываете, и в этом случае вы вызываете с параметром объекта. Затем Java использует сигнатуру метода remove(Object o) , и поскольку указанный Integer не существует в ArrayList , он возвращает false .

Теперь причина, по которой происходит сбой последнего, заключается в том, что вы создаете новый массив строк, таким образом, новый экземпляр. Поскольку new String[] { var, lex, valor } и new String[] { var, lex, valor } не равны по ссылкам, Java не находит тот же объект в ArrayList и не удаляет элемент. Решение заключается в использовании примитива int :

 public void eliminarPos(String var, String lex, String valor, int ii) {
    String[] uno = data.remove(ii); //Make sure to use String[], as different types are returned
    System.out.println(uno);
}
  

Затем Java будет использовать метод, который принимает примитивное целое число, потому что вы передаете примитивное целое число. Причина, по которой вы видите incompatible types: String[] cannot be converted to boolean , заключается в том, что remove(int index) возвращает фактический объект в указанной позиции или удаленный объект, а не boolean подобный remove(Object o) .

Ответ №2:

 data.remove(new String[]{var, lex, valor});
  

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


 public void eliminarPos(String var, String lex, String valor, Integer ii) {
    boolean uno=data.remove(ii);
    System.out.println(uno);
}
  

Не будет работать, потому что вы передаете его Integer вместо an int . An Integer — это объект, поэтому он ищет этот объект в списке. Измените его на:

 public void eliminarPos(String var, String lex, String valor, int ii) {
    data.remove(ii);
}
  

Ответ №3:

remove строковый массив не будет работать, list.remove так как вызывает equals() объект. В случае array.equals это просто сравнение ссылок ( == ).

Удаление по позиции работает, и вы должны указать правильный индекс как примитивный int .

 public void eliminarPos(String var, String lex, String valor, int ii) {
    String[] uno=data.remove(ii);
    System.out.println(uno);
}