2016-10-02 73 views
1

当我将实体对象添加到我的ArrayList(这里称为实体)时,存在问题。每个实体对象都有一个长ID,int x位置和y位置当添加对象时,Java ArrayList大小变得很大

首先我检查列表是否为空,它应该在开始位置。如果我添加第二个实体对象,我检查对象的ID是否存在,如果是,则更新实体对象的位置。如果该对象不存在,则应该添加该对象。

我的问题是,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()); 
    } 
} 
+0

定义“巨大”。 –

+0

大约20000+,当它应该是2的大小。 –

+0

只要与迭代器中的项目不匹配,您的循环就会添加该项目。只有当* no *项与迭代器中的项匹配时才想添加项。 – Eric

回答

3

的问题是,您要添加新条目到每一个你发现它不具有相同的ID入口时刻列表...您的通话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); 
} 

请注意,这是怎么回事,如果你增添不少实体是非常低效的。从实体ID到实体的映射会更加高效......然后,您不必每实体实体时间检查

+0

啊,现在我明白了这个问题。非常感谢你的帮助。 –