【问题标题】:How to Iterate Two Lists and compare the items within?如何迭代两个列表并比较其中的项目?
【发布时间】:2013-10-23 06:52:59
【问题描述】:

我在大学的最后一个项目快要结束了,我正试图用我当前的文章库存来控制我的库存。

我的股票包含以下属性:

int idMercaderia;
int cantidad;
int idSucursal;

我有两个列表包含Inventario 类型POJOs:

List <Inventario> stock = new InventarioDAO().findAll();
List <Inventario> inStock = new ArrayList <Inventario>();

在持久化数据库之前,我想比较两者中的属性idMercaderia,如果它们相同,请不要创建另一个条目,只需将数量cantidad 添加到当前库存并执行saveOrUpdate() 如果不只是创建另一个条目。

在尝试迭代两个列表后,我真的被困在这部分并且目前没有想法,但我无法弄清楚股票的事情。

任何帮助/代码将不胜感激。

【问题讨论】:

  • 您是否在 Inventario 中实现了 equals 方法。如果是,请说明它的逻辑。
  • Inventario 是通过 MyEclipse 使用逆向工程生成的,所以我只得到了 Hibernate DAO(save()delete()findById() 等)
  • org.apache.commons.beanutils [check this](stackoverflow.com/questions/6099040/…) 用于比较 bean
  • @user2334391 感谢分享这个,我现在在我的迭代中结束这个。

标签: java hibernate list compare


【解决方案1】:

如果Inventario 中尚未发生equals() 方法,您需要实现一个idMercaderia 来比较那里的idMercaderia。那么

for(Inventario item: stock){
   if(inStock.contains(item)){
       item.cantidad++;  
   }
}

【讨论】:

  • 这是一种可能的解决方案,但使equals 非常特定于上下文,并且在我看来隐藏了一些逻辑。这也是未来 bug 的可能来源,因为有人可能会更改 equals 方法(如果我们将其视为企业应用程序)。所以这里需要好的单元测试。
  • 我会试试这个,但尝试item.getCantidad() ++ 将是我的问题,谢谢。
  • @user714965 是的,它隐藏了一点逻辑,但如果 idMercaderia 是唯一标识符,应该没有问题。如果java对此有类似比较器的方法会更好,或者你必须使用java 8;)
【解决方案2】:

为您的第一个列表创建一个Map&lt;Integer, Inventario&gt;,以将一个idMercaderia 映射到一个Inventario。然后迭代您的第二个列表并检查地图中对应的每个项目。

Map<Integer, Inventario> map = new HashMap<Integer, Inventario>();
for (Inventario item : stock) {
   map.put(item.getIdMercaderia(), item);
}

for (Inventario item : inStock) {
   int idMercaderia = map.getIdMercaderia();
   Inventario inventario = map.get(idMercaderia);
   if (inventario == null) {
      // error handling
      continue;
   }
   if (item.getCantidad() == inventario.getCantidad() {
      // handle 
   }
}

【讨论】:

  • 这对我来说很有意义,我将map.put(item.getIdMercaderia(), item) 更改为map.put(item.getMercaderia().getId(), item),但在我的第二个列表的迭代中,我无法承受map.getIdMercaderia()。只显示地图方法,有什么线索吗?
  • Map 就是这样工作的。你 put 一个键/值对并调用 get(key) 来检索值。所以在你的情况下map.get(item.getMercaderia().getId()) 将返回item
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多