2013-10-23 60 views
1

我几乎在我大学最后一个项目的结尾,我试图用我目前的股票文章来控制我的inStock。如何迭代两个列表并比较内部的项目?

我的股票包含以下属性:

int idMercaderia; 
int cantidad; 
int idSucursal; 

我有一个包含InventarioPOJO的两个名单:

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

之前坚持的数据库,我想属性idMercaderia比较他们两个,如果他们是相同的不创建另一个条目,只是将数量cantidad添加到当前的股票,并做一个saveOrUpdate()如果不只是创建另一个条目。

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

任何帮助/代码将非常感激。

+0

你有没有实现在Inventario的equals方法。如果是这样,请显示它的逻辑。 – shazin

+0

'Inventario'是使用ReverseEngine和MyEclipse生成的,所以我只有Hibernate DAO的('save()','delete()','findById()'等) –

+1

org.apache.commons.beanutils [检查此](http://stackoverflow.com/questions/6099040/find-out-the-differences-between-two-java-beans-for-version-tracking/6099386#6099386)用于比较豆 – jos

回答

1

你需要的,如果在Inventario尚未发生在那里比较idMercaderia实现一个equals()方法。然后

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

这是一个可能的解决方案,但使'equals'具有非常特定的上下文,隐藏了我的观点逻辑。这也是未来错误的一个可能来源,因为有人可能会改变'equals'方法(如果我们将其视为企业应用程序)。所以这里需要良好的单元测试。 – Kai

+0

要试试这个,但试图'item.getCantidad()''++'将是我的问题,谢谢。 –

+0

@ user714965是的,它隐藏了一点逻辑,但是如果'idMercaderia'是唯一的标识符,那么应该没有问题。这会更好,如果Java将有一个比较类似的方法,或者你必须使用Java 8;) – kromit

1

创建第一个列表的Map<Integer, Inventario>映射一个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 
    } 
} 
+0

这使感官对我的艰难,我改变了'map.put(item.getIdMercaderia(),item)'到'map.put(item.getMercaderia()。getId(),item)'但是在我的第二个List的迭代中,我不能做'map.getIdMercaderia()'。只显示地图方法,对此有任何线索? –

+0

这就是[Map](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html)的工作原理。你把一个键/值对放进去,并调用'get(key)'来检索这个值。因此,在你的案例'map.get(item.getMercaderia()。getId())'将返回'item'。 – Kai