#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);
}