Ошибка в методе remove класса ArrayList
package Lesson20;
import java.util.ArrayList;
public class Test3_4 {
public static void main(String[] args) {
ArrayList<StringBuilder> list = new ArrayList<>();
StringBuilder sb1 = new StringBuilder("Один");
StringBuilder sb2 = new StringBuilder("Два");
StringBuilder sb3 = new StringBuilder("Три");
list.add(sb1);
list.add(sb2);
list.add(sb3);
list.remove("Два");
for(StringBuilder s: list){
System.out.print(s + " ");
}
}
}
Почему не сработает метод remove?
Если тип данных будет например String, то все сработает отлично
package Lesson20;
import java.util.ArrayList;
public class Test3_3 {
static void showInfo(ArrayList array){
for(int i=0; i< array.size(); i++){
System.out.print(array.get(i)+ " ");
}
System.out.println();
System.out.println("-------------");
}
public static void main(String[] args) {
ArrayList <String> list = new ArrayList<>();
list.add("Ноль");
list.add("Один");
list.add("Два");
list.add("Три");
list.add("Четыре");
showInfo(list);
list.remove("Три");
showInfo(list);
}
}
Ответы (2 шт):
Автор решения: motpfofs
→ Ссылка
Как правильно написали вам в комментариях: в списке вы используете тип StringBuilder, а удалить пытаетесь объект типа string. Поэтому ничего не удаляется.
Вам нужно пытаться удалить объект:
list.remove(sb2);
Если вы хотите удалить элемент StringBuilder, но у вас есть только инфомация о строке, попробуйте воспользоваться этим кодом:
Iterator<StringBuilder> itr = list.iterator();
while (itr.hasNext()) {
StringBuilder strbldr = itr.next();
if(strbldr.toString().equals("2"))
{
itr.remove();
}
}
Автор решения: Barmaley
→ Ссылка
Вообще оба кода неправильные, 2-й работает, только благодаря оптимизации компилятора. Поясняю:
- В первом коде элемент не удаляется не потому, что хранится
StringBuilder, а вы удаляетеString. Сигнатура метода удаления такая:remove(Object object), то есть на вход надо подавать ссылку на объект, который вы хотите удалить, именно поэтому конструкцияlist.remove(new StringBuilder("Два"))не сработает, поскольку сложили 1 объект, а пытаетесь удалить другой - Во второй конструкции немного хитрее, потому что компилятор "понимает", что объект
"Три"в конструкцииlist.add("Три")иlist.remove("Три")один и тот же, поэтому удаление срабатывает.
Правильный код должен быть примерно такой:
ArrayList<StringBuilder> list = new ArrayList<>();
StringBuilder sb2 = new StringBuilder("Два");
list.add(sb2);
list.remove(sb2);