我有一个所有市场类型的列表,以及所有市场的列表(每个对象都有一个市场typeId)
我想要一个市场类型列表,其中仅包含所有市场列表中的市场类型(没有重复的市场类型)。怎么做?
这是我的代码:
import tkinter, random
root = tkinter.Tk()
root.title('Widget Collision Test - Grid Layout')
labels = []
for i in range(3):
labels.append(tkinter.Label(root, text=str(i+1)))
labels[i].grid(
row=0, column=0,
padx=50, pady=50,
sticky=random.choice('N W S E'.split()))
root.mainloop()
答案 0 :(得分:1)
您可以使用map
来表达更为简洁:
marketsFilter.map { market ->
MyApplication.allMarketTypes.single { it.id == market.marketTypeId }
}.distinct()
无需处理原始索引。
注意:如果要使用single取决于您的用例,请查看下面的列表,然后自己决定。
single
:返回与给定谓词匹配的单个元素,如果不存在一个或多个匹配元素,则抛出异常。
singleOrNull
:返回与给定谓词匹配的单个元素;如果找不到元素或找到多个元素,则返回null
。
first
:返回与给定谓词匹配的第一个元素,如果不存在则抛出异常。
firstOrNull
:
返回与给定谓词匹配的第一个元素;如果找不到元素,则返回null
。
如果您决定使用...OrNull
变体,请使用mapNotNull
丢弃空值。
marketsFilter.mapNotNull { market ->
// ...
}.distinct()
答案 1 :(得分:0)
for (i in marketsFilter.indices) {
val market = marketsFilter[i]
marketTypes.add(
MyApplication.allMarketTypes.single { it.id == market.marketTypeId })
}
marketTypes = marketTypes.distinct().toMutableList()
答案 2 :(得分:0)
您可能对以下内容感兴趣:
val marketTypes = marketsFilter.mapNotNull { market ->
MyApplication.allMarketTypes
.singleOrNull { it.id == market.marketTypeId }
}.distinct().toMutableList()
您可能还对反之亦然的方法感兴趣,基本上只过滤市场类型作为市场过滤器的ID,例如:
val marketTypes = MyApplication.allMarketTypes.filter { type -> marketsFilter.any { it.marketTypeId == type.id } }
.toMutableList() // no distinct needed
如果您也可以根据需要将.distinct().toMutableList()
替换为.toMutableSet()
。
请注意,如果您经常检查allMarketTypes
,则可能希望将它们放在地图中,例如:
val allMarketTypesMap = allMarketTypes.associateBy { it.id }
这样,您的进一步映射将变得更加容易,例如:
val marketTypes = marketsFilter.mapNotNull { allMarketTypesMap[it.marketTypeId] }
.distinct().toMutableList() // or just .toMutableSet()
作为allMarketTypes
中重复项的注释(如果有的话):associateBy
将仅收集具有相同ID的所有条目中的最后一个,基本上丢弃任何重复的市场类型。另一方面,如果存在一个以上具有相同ID或没有ID的市场类型,则single
基本上将失败(或者,如果您使用singleOrNull
,它将返回null
)。请记住这一点。