2016-06-28 83 views
0

我會盡可能地解釋我的問題。Scala;我如何迭代一個列表並遍歷每個迭代中的另一個列表

所以我有一個庫存物品清單,在一個交貨。我希望能夠遍歷此列表,並通過迭代產品列表來查找匹配的產品ID,直到庫存物料清單的產品ID與產品清單匹配,然後遞增產品數量。

所以StockItem類看起來是這樣的:

case class StockItem(val spiId : Int, val pId :Int, val sdId :Int, val quan : Int) 

我的產品類看起來是這樣的:

case class Product(val prodId : Int, val name : String, val desc : String, val price : Double, var quantity : Int, val location : String) 

我必須找到所有具有特定SPID,該StockItems的方法,它返回一個StockItems列表:

def findAllItemsInSP(sdId: Int): List[StockPurchaseItem] = stockPurchaseItems2.filter(_.sdId == sdId) 

我有另一種方法是未完成迭代噸通過此列表並遞增每個產品的數量:

def incrementStock(spID: Int){ 
     val items = StockPurchaseItem.findAllItemsInSP(spID) 

    for (i <- items){ 
     if(i.pId == products.prodId) 
    } 
    } 

產品是一組產品對象。很明顯,products.prodId不起作用,因爲我需要引用產品Set中的一個元素,而不是整個集合。我不知道如何在一組產品中找到匹配的產品ID。任何幫助,我會非常感激。

注意:sdId和spId指的是相同的東西。

非常感謝 成龍

回答

0
def incrementStock(spID: Int){ 
    val items = StockPurchaseItem.findAllItemsInSP(spID) 

for (i <- items) { 
    for (p <- products) { 
    if(i.pId == p.prodId) 
     products += p 
} 
+0

謝謝您的回覆。我不希望將數量更新爲1,我希望通過將現有數量與新產品交貨中收到的產品數量相加來獲得新數量。 –

+0

所以你想把它添加到產品?我編輯了我的回覆。 – Simon

-1

好,我已經成功地做什麼,我希望通過與該產品ID的現有屬性創建一個新的產品,然後加入到量做。

def incrementStock(spID: Int){ 
     val items = StockPurchaseItem.findAllItemsInSP(spID) 

    for (i <- items){ 
     var currentProd: Product = Product(Product.findProduct(i.pId).get.prodId, Product.findProduct(i.pId).get.name, Product.findProduct(i.pId).get.desc, Product.findProduct(i.pId).get.price, Product.findProduct(i.pId).get.quantity, Product.findProduct(i.pId).get.location) 
     currentProd.quantity += i.quan 

     products -= (findProduct(i.pId).get) 
     products = products + currentProd 
    } 

    printProductInfo() 
    } 
2

月1日 - 的所有參數case class是自動類值,所以你不需要這些val標籤。

第2步 - 您說「有一種方法可以找到所有具有特定spId的StockItem」,但該代碼正在篩選_.sdId == sdId。 SPID? SDID?有點混亂。你說「products是一組Project對象」。你的意思是Product對象?我沒有看到任何「項目」代碼。

所以,你可以做的一件事是讓items a Map[Int,Int],它翻譯pId數量,但默認爲零。

val items = StockPurchaseItem.findAllItemsInSP(spID).map(x => (x.spId, x.quantity)).toMap.withDefaultValue(0) 

現在,你可以通過products走,通過items(spId)每遞增量。

products.foreach(p => p.quantity += items(p.spId)) // or something like that 
+0

謝謝對不起,有一些錯別字,我現在會改正它們 –

2

你可以用類似於以下類似方法的'for-comprehension'Docs來做到這一點。

val stockItems: List[StockItem] = ??? 
val products: List[Product] = ??? 
val result: List[Product] = for{ 
    item <- stockItems 
    p <- products 
    if p.prodId == item.pId 
} yield { p.copy(quan = p.quan + 1) } //I expect you'd want different logic to this 
+0

這可能是最直接和最有效的方法。 – patrykos91

+0

檢查關於綜合的斯卡拉風格指南:http://docs.scala-lang.org/style/control-structures.html#comprehensions嘗試避免使用分號。 –

+0

對不起,我只是懶惰,因爲我沒有可用的代碼編輯器,並希望是安全的。 已編輯,謝謝。 –

相關問題