【问题标题】:How do I drop an item from a list when it doesn't have a specific name?当项目没有特定名称时,如何从列表中删除项目?
【发布时间】:2016-04-26 14:17:09
【问题描述】:

如果项目没有实际名称,我如何从列表中删除项目?

我有一个类,其中包含一个名为additem 的方法,该方法添加了我在另一个类中构造的Item 对象。 Item 对象有两个参数:String name, String type,分别是项目的名称和项目的类型。以下是additem 方法的代码:

public void additem(String name, String type){
    if("Weapon".equals(type)){
        itemlistweapons.add(new Item(name, type).toString());
    }
    else if ("Apparel".equals(type)){
        itemlistapparel.add(new Item(name, type).toString());
    }
    else if ("Aid".equals(type)){
        itemlistaid.add(new Item(name, type).toString());
    }
    else if ("Misc.".equals(type)){
        itemlistmisc.add(new Item(name, type).toString());
    }
}

所以,当我在主类的列表中添加一个项目时,我会这样做:

items list = new items();

list.additems("Itemname", "Itemtype");

所以我从来没有真正给对象一个名字来调用。如果该项目从未被识别,我怎么能有一种方法从列表中删除该特定项目?有没有办法通过以某种方式给对象命名来识别项目?

【问题讨论】:

  • 当根本没有同名的项目时,如何删除它?
  • 只有一个没有名字的对象吗?如果有多个,你怎么知道你想要哪个?
  • Item构造函数的第一个参数一个名字。我很困惑你为什么说它没有名字。
  • @dcsohl 他可能的意思是他传递了一个空字符串。您可以遍历列表并找到名称为 null 或为空的列表。
  • 按列表中的索引。

标签: java class arraylist


【解决方案1】:

为什么不喜欢这样:-

public void removeitem(String name, String type) {

String checkItem = new Item(name, type).toString();

  for(int i = itemslistaid.size(); i > 0 ; i--)  {
    if(itemslistaid.get(i).equalsIgnorecase(checkItem))
         itemslistaid.remove(i);
  }
}

【讨论】:

  • 这是一种不好的做法,因为它会在删除项目之后跳过该项目。改用迭代器或从末尾删除:stackoverflow.com/questions/10738634/…
  • @Tobold 谢谢,我今天学到了一些新东西,感激不尽,我会编辑我的答案
【解决方案2】:

在 java 中,为对象定义标识符以便再次引用它的方法是覆盖对象的 equals() 和 hashCode() 方法......这是你可以告诉你什么对象的方法以后在找

【讨论】:

    【解决方案3】:

    使用地图来保存/查找和“命名”您的列表,然后它只是您的 add()remove() 方法中的一行代码,它会自动适应任意数量的命名列表:

    private Map<String, List<String>> map = new HashMap<>();
    
    public void additem(String name, String type) {
        map.computeIfAbsent(name, k -> new ArrayList<>()).add(type);
    }
    
    public void removeitem(String name, String type) {
        Optional.ofNullable(map.get(name)).ifPresent(l -> l.remove(type));
    }
    

    【讨论】:

      【解决方案4】:

      在给定的代码中,您将对象的字符串值添加到列表中

      itemlistweapons.add(new Item(name, type).toString());
      

      这很好。但如果是这样,toString 将不会返回实际字符​​串 你可以在Item 类中使用override toString 方法

          class Item{
      
          public String toString(){
          return name+""+type;
          }
      
          }
      

      现在您返回了一个实际的字符串,您可以将其更改为从您的类中返回任何字符串。

      itemlistweapons.add(new Item(name, type).toString()); // this will contain string from toString method
      
      itemlistweapons.remove(yourItem.toString); //this will remove item containing your string.
      

      【讨论】:

        猜你喜欢
        • 2019-03-17
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 2017-09-03
        相关资源
        最近更新 更多