我正在嘗試創建一個應用程式,讓您輸入您想吃什么和喝什么。它會計算所有這些,然后當您按下列印按鈕時,我希望它計算每個專案在串列中的頻率并像這樣回傳:
“9x 果汁 /n 5x 牛排 /n 4x 沙拉”
飲料和食物是新類 Edibles 中的物件:
class Edibles(val name: String, val price: Double):Serializable {
}
我跟蹤 MutableList 順序中的所有物件,并且可以訪問串列的不同成員及其屬性,但是當我嘗試洗掉串列中的所有重復項時,android studio 抱怨并且我不知道如何修復它。
我嘗試計算串列順序中有多少成員:
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,當我嘗試實作它時,它希望我覆寫一堆我不知道如何處理它的函式。 .
如果有人對如何以不同的方式進行解釋甚至修復或想法,我將不勝感激
uj5u.com熱心網友回復:
removeAll意味著采用串列或謂詞,而不是單個元素。如果您將元素轉換為檢查相等性的謂詞,它將洗掉所有等于該元素的元素。
order.removeAll { it == order[0] }
但是,您還需要記住迭代的第一條規則:在迭代時永遠不要洗掉。因此,您真正想要做的是將所有“洗掉”候選者累積到一個串列中,然后在事后洗掉它們。
事實上,你在這里所做的事情可以在根本不改變串列的情況下完成,使用一個名為groupBy.
var totalOrder = ""
for (entry in order.groupBy { it }) {
val item = entry.key
val count = entry.value.size
totalOrder = "${count}x${item.name}\n"
}
uj5u.com熱心網友回復:
無論如何,您都不允許在 for 回圈中迭代集合時對其進行變異。洗掉重復項的一種方法是創建一個臨時的 MutableSet 并在removeAll操作中將每個專案與其進行比較。removeAll接受在每個專案上呼叫的 lambda 謂詞和從謂詞回傳的布林值。當您呼叫addMutableSet 時,它會回傳一個布林值來告訴您該專案是否已經在集合中,因此您可以使用以下內容洗掉重復項。
假設您只想比較專案名稱以確定它們是否重復,您可以創建一個MutableSet<String>.
with (mutableSetOf<String>()) {
order.removeAll { add(it.name) }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478034.html
