Проблема Java ArrayList.remove()
Это часть моего кода.
Integer keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex));
someArrayList.remove(keyLocation);
Итак, что я делаю здесь, я назначаю keyLocation (первое вхождение строки в arrayList reducedFD). Но когда я хочу удалить из someArrayList элемент с этим ключом, это не сработает.
Если я буду вводить вручную:
someArrayList.remove(0); //Let say 0 is the actual keyLocation
Это действительно работает.
Что странно, так это то, что следующий код:
someArrayList.remove(keyLocation + 1);
Любые подсказки?
Вот основной цикл:
for (int KEYindex = 0; KEYindex < KeyPlus.size(); KEYindex++){
Integer keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex));
if (reducedFD.contains(KeyPlus.get(KEYindex))){
KeyPlus.add(reducedFD.get(keyLocation+1));
CheckedAttributesPlus.add(KeyPlus.get(KEYindex));
reducedFD.remove(keyLocation);
}
}
Ответы
Ответ 1
Проблема в том, что вы передаете Integer методу remove, а не int. Когда вы передаете Integer, он предполагает, что сам Integer - это то, что вы пытаетесь удалить, а не значение этого индекса. Сравните методы
remove(Object o)
remove(int i)
так:
int keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex));
someArrayList.remove(keyLocation);
Ответ 2
Вот краткое описание:
remove(Object o) // remove object
remove(int index) // remove the object in that index
если вы пишете .remove(5)
, компилятор понимает его как примитивный тип, а index и удаляет index(5).
. Если вы хотите удалить объект, вы должны написать .remove(new Integer(5))
Ответ 3
Интерфейс List
имеет два метода remove()
, один из которых получает Object
(и пытается удалить этот объект из списка), а другой, который получает int
(и пытается удалить объект, индекс которого - заданный int).
Обычно предоставление метода Integer
приводит к автоматическому распаковке или автоматическому преобразованию в примитив int
. В этом случае компилятор не будет пытаться автоматически распаковывать, потому что там есть отличный метод, который получает Object
и Integer instanceof Object
... Я предполагаю, что ваш список не List<Integer>
, поэтому он не работает зрелищно.
Добавление int к вашему Integer
приводит к принудительному распаковке, а добавление приводит к int
- идеально подходит для другого метода remove()
.
Ответ 4
int keyLocation = reducedFD.indexOf(KeyPlus.get(KEYindex)); //Use a primitive int
someArrayList.remove(keyLocation);
Ответ 5
Или вы можете просто сделать:
someArrayList.remove(keyLocation + 0);
Ответ 6
Вы можете вызвать это вместо создания int
someArrayList.remove(integerKeyLocation.intValue());
Ответ 7
Если вы посмотрите на ArrayList
JavaDoc, вы найдете это объявление.
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public E remove(int index){
.
.
.
}
Integer
отличается от int
. Имеет ли смысл следующее?
someArrayList.remove((int)keyLocation);