【问题标题】:Add element to arraylist and test if the number already exist将元素添加到arraylist并测试该数字是否已存在
【发布时间】:2011-07-18 09:12:58
【问题描述】:

我有一个将元素添加到数组列表的方法 我的任务是修改 addProduct 方法,以便新产品 无法添加到具有相同 ID 的产品列表中 作为现有的。

由于数字和字符串都在同一个单词“item”中并存储在同一个索引中,我不知道如何才能获得数字。我需要号码来测试看看号码是否已经存在

关于我应该如何做到这一点的任何建议?

我添加到arraylist的方式如下:

(new Product(132, "Clock Radio"))

public void addProduct(Product item)
{
 stock.add(item);
 }

【问题讨论】:

  • Ummm ...该代码无效java。再试一次。
  • @radder,您愿意将“库存”的类型更改为 Set 吗?这将解决您的问题。
  • 您的意思是您有一个 Product 类型的对象,其中包含一些成员,而您不知道如何访问特定成员?
  • @Tadusz Kopec 我有一个数组列表,其中包含产品名称和产品 id 编号。id 和名称都在同一个单词“item”中 Public void addProduct(Product item) 我不知道如何仅从项目中获取数字,以便我可以使用该数字来查看该数字是否已存在于数组列表中。有什么建议吗?
  • @Stephen 为什么这不是一个有效的 java 代码?带有“(new Product(132, “Clock Radio”))”的代码行仅用于显示我如何将产品名称和 id 添加到参数中。你没有告诉我如何从我请你专业程序员帮助我的“项目”这个词中得到数字

标签: java arraylist


【解决方案1】:

我强烈建议您在 addProduct() 方法中使用 Set

来自 Javadocs,

SET
不包含重复元素的集合。更正式地说,集合 不包含元素对 e1 和 e2 使得 e1.equals(e2),并且在 最多一个空元素。

这样实现,

public static boolean checkDuplicate(ArrayList list) {
 HashSet set = new HashSet();
 for (int i = 0; i < list.size(); i++) {
  boolean val = set.add(list.get(i));
  if (val == false) {
    return val;
  }
 }
 return true;
}

【讨论】:

  • 没有解决这个问题:“由于数字和字符串都在同一个词“项目”中并存储在同一个索引上,我不知道如何才能得到数字。”还要求您以在其他地方可能不合适的方式实现“equals”和“hashCode”。您会丢失广告订单。
  • 随着集合的增长,每次在添加项目时进行迭代可能是一件代价高昂的事情。
  • 如果您可以创建一次然后在添加项目时进行操作或遍历,则每次在添加之前检查重复项时都不需要创建一个新的 HashSet 对象。
  • @Thilo 当单词包含数字和字符串时,您知道如何从单词“item”中获取数字吗?
【解决方案2】:
public void addProduct(Product item){
   for (Product p: stock)
      if (p.getId() == item.getId())
         return;
   stock.add(item);
}

【讨论】:

  • 我尝试使用第二个数组列表将产品项目添加到,然后循环通过它来获取数字,但我又遇到了同样的问题,我不能只得到数字。
【解决方案3】:

我会使用 java.util.Set。您需要根据传递给构造函数的两个字段来实现 Product 类的 equals() 和 hashcode() 方法。

【讨论】:

  • 但是,请注意仅针对当前情况实施 equals 和 hashCode 的潜在副作用。谁知道在所有情况下是否应仅根据 ID 将产品视为平等。
【解决方案4】:

尝试使用以 ID 为 Key 和 Item 为 Value 的 HashMap。在 HashMap 中,您不能使用相同的 Key 复制 Item,因此您的问题在编程的底部得到了解决。 :)

【讨论】:

  • 这样你会丢失插入顺序。
  • @Thilo 没有 LinkedHashMap
  • LinkedHashMap 会更好,是的。但是,尚不清楚是否允许 OP 更改数据结构。它说他的工作是如果 id 不存在,则添加到 ArrayList。
【解决方案5】:

创建一个 ProductList 类,该类具有一个 ArrayList 字段和一个整数集以跟踪已添加的 ID。添加项目时,请检查集合是否已包含项目的 ID。如果没有,则将该项目添加到 ArrayList。所以这基本上很好地包裹了一个 ArrayList。以下是我的做法:

public class ProductList{
...
    private ArrayList<Product> list = new ArrayList<Product>();
    private Set<Integer> ids = new Set<Integer>();
...
    public void addProduct(Product product){
       if(!ids.contains(product.getID())){
            list.add(product);
            ids.add(product.getID());
           }
         }

    public Product removeProduct(Product product){
       if(!list.contains(product)) return null;
       ids.remove(product.getID());
       return list.remove(product);
      }
...
    }

然后你就可以使用

ProductList stock = new ProductList();

stock.addProduct(Product item); 在你的其他班级。

如果您认为您会非常广泛地使用您的列表,那么创建实用的构造函数以与您的数据字段集成也会非常有用。

从抽象的角度来看,这是一个非常好的方法,但它可能不是最有效的方法。

【讨论】:

  • 另一个 ArrayList 而不是 Set 也可以正常工作。
  • 我尝试过使用if(list.contains(product){ },但它不起作用。我的产品将与列表中的产品相同,但它始终属于else 语句而不是if 语句。如果有人有任何想法,我很想知道。我不得不做大量的 for 循环,这看起来真的很草率。
  • @alsobubbly product 是什么类型的对象?如果它是您创建的类,您可能希望覆盖属于Object 类的equals 方法。这允许您定义product 何时实际上等于另一个。 contains 方法在我认为的列表中的每个产品上调用 equals 方法。如果你愿意,试一试并报告。可以在这里阅读更多内容:equals method in javaartima.com/lejava/articles/equality.html
  • 感谢您的帮助。最后我发现产品对象与产品列表中的产品不匹配,因为它被视为新产品项目或类似的东西。我解决它的方法是为每个我想检查列表的产品做一个em.find(Product.class, product.getID());,并从找到的产品对象而不是原始列表中的产品对象中进行检查(如果这有意义的话)。这似乎工作正常。
  • 我很高兴你让它工作,但我不确定这是否是最佳实践。如果需要,您可以将代码粘贴到 pastebin 中,然后将链接发送给我,以便我提出一些建议?由你决定。
猜你喜欢
  • 1970-01-01
  • 2021-03-19
  • 2013-11-11
  • 2011-10-15
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多