首页 > 解决方案 > 比较 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)}

标签: kotlin

解决方案


映射到总数

假设您正在尝试获取发票总额,您可以执行以下操作:

    val totals = invoiceItem.groupBy { it.numInvoice2 }.mapValues { item ->
        item.value.sumByDouble { it.unitPrice * it.quantity }
    }

totals是发票编号与所有相关项目总价的映射。(假设您正在尝试invoice加入invoiceIteminvoiceNumber2 = 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 }
        )
    }

您可以在mapValueslambda 中返回您想要的任何内容,但是代码变得荒谬且效率低下。我建议尝试扩展属性解决方案。


推荐阅读