如何返回已删除的对象?

时间:2014-10-08 16:43:09

标签: java

我有一个方法,当输入该InventoryItem的部分描述时,该方法应该删除数组列表(iList)中的InventoryItem(i)。该方法必须返回已删除的项目,并且我不确定如何执行此操作。到目前为止,这是我的代码。

public InventoryItem deleteInventoryItem(String descriptionIn) {

  int index = -1;
  boolean result = false;

  for (InventoryItem i : iList) {
     if (i.getDescription().toLowerCase().startsWith(descriptionIn.toLowerCase())) {
        index = (iList.indexOf(i));
        result = true;  
     } 

     if (index >= 0) {
        iList.remove(index);
     } 
  }

  return null;


}

5 个答案:

答案 0 :(得分:4)

  

我不能使用迭代器。 [...]我需要为每个循环使用a

这是一种方式:

public InventoryItem deleteInventoryItem(String descriptionIn) {
    for (InventoryItem item : iList)
        if (item.getDescription()
                .toLowerCase()
                .startsWith(descriptionIn.toLowerCase())) {
            iList.remove(item);
            return item;
        }
    }
    return null;
}

请注意,这会从列表中删除最多一个对象。如果有多个匹配项,则只会删除第一个匹配项。

  

如果我只是想找到并返回一个对象而不是删除它,[...]

然后您只需跳过iList.remove(item)行。

但更好的方法是将方法拆分如下:

public InventoryItem findInventoryItem(String descriptionIn) {
    for (InventoryItem item : iList)
        if (item.getDescription()
                .toLowerCase()
                .startsWith(descriptionIn.toLowerCase())) {
            return item;
        }
    }
    return null;
}

public InventoryItem deleteInventoryItem(String description) {
    InventoryItem item = findInventoryItem(description);
    if (item != null)
        iList.remove(item);
    return item;
}

答案 1 :(得分:2)

您需要在删除对象之前存储该对象。然后返回该对象。

public InventoryItem deleteInventoryItem(String descriptionIn) {

  int index = -1;
  boolean result = false;
  for (InventoryItem i : iList) {
     if (i.getDescription().toLowerCase().startsWith(descriptionIn.toLowerCase())) {
        index = (iList.indexOf(i));
        result = true;  
     } 

     if (index >= 0) {
        return iList.remove(index);
     } 
  }
  return null;
}

请注意,如果此返回null表示没有删除任何内容。


编辑

如果您只想返回对象而不删除它。 将return iList.remove(index);替换为return iList.get(index);

答案 2 :(得分:0)

我认为您只需要在return方法前面加remove个关键字。但是考虑到你把它搞砸了会导致ConcurrentModificationException,我改了一下。

public InventoryItem deleteInventoryItem(String descriptionIn) {
  Iterator<InventoryItem> iterator = iList.iterator();
  while(iterator.hasNext())
  {
      InventoryItem i = iterator.next();
      if (i.getDescription().toLowerCase().startsWith(descriptionIn.toLowerCase())) {
          iterator.remove();
          return i;
      }
  }
  return null;
}

答案 3 :(得分:0)

您只是将其从列表中删除,而不是从内存中删除该对象。您已经有了对它的引用,因此您可以在从列表中删除后返回它。

for (InventoryItem i : iList) {
    if (i.getDescription().toLowerCase().startsWith(descriptionIn.toLowerCase())) {
        iList.remove(i);
        return i;
    }
}

答案 4 :(得分:0)

像这样的东西。我只是编辑它以避免ConcurrentModificationException并且还将index的声明移动到for循环中。

public InventoryItem deleteInventoryItem(String descriptionIn) {
  InventoryItem returnItem = null;
  InventoryItem i = null;
  for (int j = 0; j < iList.size(); j++) {
       boolean result = false;
       i = iList.get(j);
       if (i.getDescription().toLowerCase().startsWith(descriptionIn.toLowerCase())) {
           returnItem = i;
           iList.remove(j);  
           j--;
       } 
   }
   return returnItem;
}