我正在使用Scala,并且希望能够选择属性设置为给定值的对象的所有实例。假设我有一个Order类和一个Order Item类,我想选择或拉出订单ID为1的所有订单项,并在列表中返回所有这些,我该怎么做?
我希望能够返回订单ID为1
的订单项列表这是我的Line Item类定义: 代码:
case class LineItem(val itemId : Int, val orderId:Int, val productId:Int, val quantity:Int)
然后我在对象中定义了一些订单项:
代码:
object LineItem {
val li1 = new LineItem(1, 1, 1, 10)
val li2 = new LineItem(2, 1, 4, 1)
val li3 = new LineItem(3, 1, 2, 1)
val li4 = new LineItem(4, 1, 3, 1)
val li5 = new LineItem(5, 2, 1, 1)
val li6 = new LineItem(6, 1, 7, 1)
var lineItems = Set(li1, li2, li3, li4, li5, li6)
def findItemsInOrder(ordId:Int) = lineItems.find(_.orderId == ordId)
}
正如您所见,其中5个订单项属于ID为1的订单。 因此,首先打印出一个订单列表供用户查看,然后我希望用户能够选择订单以查看该订单中的所有订单项,因此我希望这些订单项可以在外壳
因此订单ID由用户输入: 代码:
val orderNo = readLine("Which order would you like to view?").toInt
然后这一行: 代码:
println("OrderID: " + LineItem.findItemsInOrder(orderNo).get.orderId + ", ProductID: " + LineItem.findItemsInOrder(orderNo).get.productId + ", Quantity: " + LineItem.findItemsInOrder(orderNo).get.quantity)
仅打印出订单ID为1的第一个订单项。
然后我尝试遍历所有订单项,例如:
代码:
var currentLineItems = new ListBuffer[LineItem]()
for (item <- LineItem.lineItems){
val item1: LineItem = LineItem(LineItem.findItemsInOrder(orderNo).get.lineId, LineItem.findItemsInOrder(orderNo).get.orderId, LineItem.findItemsInOrder(orderNo).get.productId, LineItem.findItemsInOrder(orderNo).get.quantity)
currentLineItems += item1
}
for (item <- currentLineItems ){
println("OrderID: " + LineItem.findItemsInOrder(orderNo).get.orderId + ", ProductID: " + LineItem.findItemsInOrder(orderNo).get.productId + ", Quantity: " + LineItem.findItemsInOrder(orderNo).get.quantity)
}
但是这段代码只打印了6次相同的订单项。
我将非常感谢任何帮助解决我的问题的帮助
由于 济
答案 0 :(得分:1)
定义findItemsInOrder
以过滤掉列表中与订单ID匹配的所有元素:
def findItemsInOrder(ordId: Int): List[LineItem] = lineItems.filter(_.orderId == ordId)
find
将找到与id 匹配的第一个元素,如果找到则返回Some[T]
,其中T
是元素类型,否则None
:
查找满足谓词的序列的第一个元素(如果有的话)。
如果您有多个与ID匹配的元素,则需要filter
:
选择满足谓词的此可遍历集合的所有元素。