为什么我不能对对象列表使用 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) }
}
我正在尝试创建一个应用程序,让你输入你想吃什么和喝什么。它会计算所有这些,然后当您按下打印按钮时,我希望它计算每个项目在列表中出现的频率,然后像这样返回:
"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
.
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) }
}