Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个不同列表中的相同值-Kotlin_Kotlin - Fatal编程技术网

比较两个不同列表中的相同值-Kotlin

比较两个不同列表中的相同值-Kotlin,kotlin,Kotlin,我是kotlin的新手,我正在做这个练习,其中需要两个列表,一个用于发票,另一个用于发票值,例如: 发票。。。。。。。。。。。。。。。。。。。。。。。。。。│ 发票金额 发票编号=1。。。。。。。。│ itemName=百事可乐 客户名称=阿尔弗雷德│ 数量=2 总值=$13,00。。。。。。│ 价格=2.50 ......................................│ 发票编号=1 ......................................│

我是kotlin的新手,我正在做这个练习,其中需要两个列表,一个用于发票,另一个用于发票值,例如:

发票。。。。。。。。。。。。。。。。。。。。。。。。。。│ 发票金额
发票编号=1。。。。。。。。│ itemName=百事可乐
客户名称=阿尔弗雷德│ 数量=2
总值=$13,00。。。。。。│ 价格=2.50
......................................│ 发票编号=1
......................................│
......................................│ itemName=谷物
......................................│ 数量=2
......................................│ 价格=4
......................................│ 发票编号=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}
}
总计
是发票编号与所有相关项目总价的映射。(假设您试图在
invoiceNumber2=invoiceNumber

扩展特性 或者,您可以将扩展属性添加到VarInvoice上,而不是在数据类中将其声明为属性(请注意,您不能在函数(例如,您的主函数)中执行此操作)

val VarInvoice.total get()=invoiceItem
.filter{it.numInvoice 2==numInvoice}
.sumByDouble{it.unitPrice*it.quantity}
如果您能提供更多关于如何构建应用程序的信息,那就太好了。可能会有更好的解决方案

第1页
在你的代码之后,我得到:
{1=13.0,2=14.0,3=13.5}
,我正试图找到一种方法对其进行排序,并包括此人的ssn,如下所示:
{1=13.0“由ssn的人:84739572857,3=13.5”由ssn的人:“74959572857,2=14.0”由ssn的人:38295840284
对不起,英语不是我的主要语言,我非常感谢你

从技术上讲,您可以尝试以下方法:

val totaledInvoice=invoiceItem.groupBy{it.numInvoice2}.mapValues{item->
invoice.first{it.numInvoice==item.value.first().numInvoice2}.copy(
总计=item.value.sumByDouble{it.unitPrice*it.quantity}
)
}

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

不确定您到底想做什么。您是在每个特定发票上还是在特定发票上合计所有成本?为什么有两个发票与相同的
numInvoice
?您的代码似乎包含了很多不相关的内容,但缺少了一些重要的内容。要定义的
invoiceNumber
invoiceNumber2
在哪里?(它们是局部变量,还是您的一个类的字段?)以及连接
VarienVoice
(它似乎包含您要更新的
总计
)和
变量(它包含
单价
数量
我猜您想从中更新它)?我有2个“numInvoices”,因为“invoiceItem”的numInvoice并不总是等于“invoice”。“invoice”中的numInvoice是唯一的,但是“invoiceItem”可以在同一个“numInvoice”中包含多个项目我希望您理解,这让人困惑。我正在尝试获取“invoice”的总数“总清单+=价格*货物数量”item@gidds我正要硬编码
invoiceNumber
invoiceNumber2
,我不知道如何将
VarInvoice
连接到
varItem
以更新总数:(这正是我想要的!非常感谢!你是最棒的。我仍然有点难以理解sumByDouble的功能,它是否类似于一个
+=
?。如果我可以问的话,有没有办法让它更漂亮?比如从最低的总数到最高的排序,插入该人的
ssn
, etc@ThrowawayToLearn不完全正确。
sumBy
不会向现有数字添加值,而是返回一个新的数字,即总和。要对内容进行排序,可以使用
排序方式。
如果要将name属性添加到
VarInvoice
,则需要将该声明添加到数据类中。抱歉,我不是指名称,我指的是
invoice
列表上的字符串
ssn
。感谢您所做的一切!@ThrowawayToLearn您的意思是更改
ssn
的值吗?如果将
val
更改为
var
val
表示变量是不可变的。在您的代码之后,我得到:
{1=13.0,2=14.0,3=13.5}
我正试图找出一种分类的方法,并包括这个人的
ssn
,比如:
{1=13.0”被ssn人分类:“84739572857,3=13.5”被ssn人分类:“74959572857,2=14.0”被ssn人分类:“38840295284
对不起,英语不是我的主要语言,我真是太感谢你了!