为什么我不能对对象列表使用 removeAll?

Why can't I use removeAll on a list of objects?

我正在尝试创建一个应用程序,让你输入你想吃什么和喝什么。它会计算所有这些,然后当您按下打印按钮时,我希望它计算每个项目在列表中出现的频率,然后像这样返回:

"9x 果汁/n 5x 牛排/n 4 份沙拉

饮料和食物是新 class 食品中的对象:

class Edibles(val name: String, val price: Double):Serializable {

}

我跟踪 MutableList 顺序中的所有对象并可以访问列表的不同成员及其属性,但是当我尝试删除列表中的所有重复项时,android 工作室抱怨,我没有不知道怎么解决。

我尝试计算列表顺序中有多少成员:

var totalOrder = ""
    for(i in order){
        var number = order.count {it == order[0]}
        totalOrder = totalOrder + "$number" + "x" + order[0].name + "\n"
        order.removeAll(order[0])
    }

目前我看到的问题是,Edibles 没有接口 Collection,当我尝试实现它时,它要我覆盖一堆我不知道要做什么的函数用它来做...

如果有人对如何以不同的方式进行解释甚至修复或有想法,我将非常感激

removeAll 用于获取列表或谓词,而不是单个元素。如果将元素转换为检查相等性的谓词,它将删除所有等于该元素的元素。

order.removeAll { it == order[0] }

但是,您还需要记住迭代的第一条规则:迭代时切勿删除。所以你真正想要做的是将所有“删除”候选者累积到一个列表中,然后删除它们after-the-fact。

事实上,您在这里所做的事情完全可以在不改变列表的情况下完成,使用名为 groupBy.

的 built-in 列表组合器
var totalOrder = ""
for (entry in order.groupBy { it }) {
  val item = entry.key
  val count = entry.value.size
  totalOrder += "${count}x${item.name}\n"
}

无论如何,您不能在 for 循环中迭代集合时改变它。删除重复项的一种方法是创建一个临时 MutableSet 并在 removeAll 操作中将每个项目与其进行比较。 removeAll 采用在每个项目上调用的 lambda 谓词和来自谓词的布尔值 return。当您在 MutableSet 上调用 add 时,它 return 是一个布尔值来告诉您该项目是否已经在集合中,因此您可以使用以下命令删除重复项。

假设您只想比较项目的名称以确定它们是否重复,您可以创建 MutableSet<String>.

with (mutableSetOf<String>()) {
    order.removeAll { add(it.name) }
}