Проблема 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);