2016-06-28 84 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

对不起,我只是懒惰,因为我没有可用的代码编辑器,并希望是安全的。 已编辑,谢谢。 –

相关问题