kotlin - 比较 2 个不同列表中的相同值 - Kotlin
问题描述
我对 kotlin 很陌生,我正在做这个练习,你需要 2 个列表,一个用于发票,另一个用于发票值,例如:
发票..................│ 发票值
invoiceNumber = 1........│ itemName = Pepsi
customerName = Alfred│数量= 2
TotalValue = $13,00......│ 价格 = 2.50
.................................. .....│ invoiceNumber = 1
..................................│
.. ....................................│ itemName = Cereal
......................... .............................│ 数量 = 2
.................... .....................│ 价格 = 4
................... ......│ invoiceNumber = 1
我让它只显示我想要的invoiceNumber,但我无法得到结果来做“总+=数量*价格”这是我迄今为止尝试过的:
fun main() {
data class VarInvoice(val numInvoice: Int, val dateInvoice: String, val ssn: String, val total: Double)
data class VarItem(val nameItem: String, val quantity: Int, val unitPrice: Double, val numInvoice2: Int)
val invoice= mutableListOf(
VarInvoice(1, "25/05/1990", "84739572857", 0.00),
VarInvoice(2, "02/09/2009", "38295840284", 0.00),
VarInvoice(3, "13/07/2020", "74959572857", 0.00)
)
val invoiceItem = mutableListOf(
VarItem("Pepsi", 2, 2.50, 1),
VarItem("Cereal", 2, 4.00, 1),
VarItem("Coke", 4, 3.5, 2),
VarItem("Chicken", 1, 13.50, 3)
)
val itemInvoice = invoiceItem.groupBy(VarItem::numInvoice2)
val invoiceEqual = itemInvoice.getValue(1)
println(invoiceEqual)
//but this returns me: [VarItem(nameItem=Pepsi, quantity=2, unitPrice=2.5, numInvoice2=1), VarItem(nameItem=Cereal, quantity=2, unitPrice=4.0, numInvoice2=1)]
//and i have no idea how to do like: if invoiceNumber2 == invoiceNumber { (total += price * quantity)}
解决方案
映射到总数
假设您正在尝试获取发票总额,您可以执行以下操作:
val totals = invoiceItem.groupBy { it.numInvoice2 }.mapValues { item ->
item.value.sumByDouble { it.unitPrice * it.quantity }
}
这totals
是发票编号与所有相关项目总价的映射。(假设您正在尝试invoice
加入invoiceItem
invoiceNumber2 = invoiceNumber
扩展属性
或者您可以在 VarInvoice 上添加一个扩展属性,而不是在数据类上将其声明为属性(请注意,您不能在函数中执行此操作(例如您的主函数))
val VarInvoice.total get() = invoiceItem
.filter { it.numInvoice2 == numInvoice }
.sumByDouble { it.unitPrice * it.quantity }
如果您能提供有关如何构建应用程序的更多信息,那就太好了。可能有更好的解决方案。
PS 1
在您的代码之后,我得到:
{1=13.0, 2=14.0, 3=13.5}
并且我正在尝试找出一种对其进行排序的方法并包括该人的 ssn,如下所示:{1=13.0 "by person with ssn: "84739572857, 3=13.5 "by person with ssn: "74959572857, 2=14.0 "by person with ssn: "38295840284
对不起,英语不是我的主要语言,我非常感谢您!
从技术上讲,您可以尝试这样的事情:
val totaledInvoice = invoiceItem.groupBy { it.numInvoice2 }.mapValues { item ->
invoice.first { it.numInvoice == item.value.first().numInvoice2 }.copy(
total = item.value.sumByDouble { it.unitPrice * it.quantity }
)
}
您可以在mapValues
lambda 中返回您想要的任何内容,但是代码变得荒谬且效率低下。我建议尝试扩展属性解决方案。
推荐阅读
- javascript - 我正在尝试删除标题图像和导航栏周围的空格
- java - 返回 0 或返回 null
- jupyter-notebook - Jupyter Notebook 不显示输出
- charts - 谷歌折线图去除背景颜色
- python-3.x - Python3 discord selfbot NameError: name 'tokens' is not defined
- plot - Power-BI/DAX 累积计数值
- python-3.x - 如何在带有条件参数的函数中触发正确的条件语句
- python - 如何设置geojson的样式?
- python - 使用 BeautifulSoup 抓取 Quora 问答
- c# - C#:无法绑定到 DataSource 上的属性或列名