Kotlin筛选器列表,根据另一个列表

时间:2018-11-21 08:49:43

标签: kotlin filtering

我有一个所有市场类型的列表,以及所有市场的列表(每个对象都有一个市场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()

3 个答案:

答案 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)。请记住这一点。