#java #arraylist #iterator #size
#java #arraylist #итератор #размер
Вопрос:
У меня проблема, когда я добавляю объекты Entity в свой ArrayList (здесь называемые entities). Каждый объект-объект имеет длинный идентификатор, int x-position и y-position
Сначала я проверяю, пуст ли список, при этом он должен быть в начале. Если я добавляю 2-й объект-объект, я проверяю, существует ли идентификатор объекта, и если да, то позиции объекта-объекта обновляются. Если объект не существует, его следует добавить.
Моя проблема в том, что размер ArrayList становится огромным, и я не уверен, как это исправить.
Весь следующий код находится в методе update(), который выполняется непрерывно.
/**
* Method that checks if the entity exist or not.
* @param ent - The Entity that should be updated or added.
*/
public void checkEntity(Entity ent){
if(entities.isEmpty()){
entities.add(ent);
}
else{
for(ListIterator<Entity> li = entities.listIterator(); li.hasNext();){
Entity next = li.next();
if(next.getID() == ent.getID()){
// System.out.println("id: " next.getID() " xPos: " next.getXPos() " yPos: " next.getYPos() " type: " next.getType());
next.setXPos(xPos);
next.setYPos(yPos);
}
else{
li.add(ent);
}
System.out.println(entities.size());
}
}
Комментарии:
1. Определите «огромный».
2. Около 20000 , когда он должен быть размером примерно 2.
3. Ваш цикл добавляет элемент всякий раз, когда он не совпадает с элементом из итератора. Вы хотите добавить элемент только в том случае, если ни один элемент не совпадает с элементом из итератора.
Ответ №1:
Проблема в том, что вы добавляете новую запись в список каждый раз, когда находите запись, которая не имеет того же идентификатора … ваш add
вызов находится внутри вашего цикла, и этого не должно быть.
В принципе, у вас должно быть что-то вроде:
public void checkEntity(Entity entity) {
for (Entity candidate : entities) {
if (candidate.getID() == entity.getID()) {
candidate.setXPos(entity.getXPos());
candidate.setYPos(entity.getYPos());
// Found a matching entity, so we're done now.
// This is important, so we don't add the entity again.
return;
}
}
// Haven't found it, so add it to the list
entities.add(entity);
}
Обратите внимание, что это будет очень неэффективно, если вы добавите много объектов. Было бы намного эффективнее иметь сопоставление идентификатора объекта с объектом … тогда вам не нужно проверять каждый объект каждый раз.
Комментарии:
1. Ах, теперь я понимаю проблему. Большое спасибо за вашу помощь.