2013-10-23 57 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