首页 > 解决方案 > 按指定键的键和最后一个值过滤字典对象数组

问题描述

假设以下数据:

var randomData = [[0: 0.0], [0: 0.005399568], [0: 0.031317495], [0: 0.059395213], [0: 0.08531314], [0: 0.111231074], [0: 0.13066952], [0: 0.15010796], [0: 0.16954641], [0: 0.18898486], [0: 0.21058308], [0: 0.23002152], [0: 0.25593945], [0: 0.2753779], [0: 0.28833687], [0: 0.29697624], [0: 0.30129582], [0: 0.3056155], [0: 0.3056155], [0: 0.30777532], [0: 0.30777532], [0: 0.30993518], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [2: 0.0010798806], [2: 0.072354175], [2: 0.072354175], [2: 0.12203024], [2: 0.1717062], [2: 0.21922246], [2: 0.26889843], [2: 0.30993518], [2: 0.3423326], [2: 0.36393085], [2: 0.3790496], [2: 0.39200857], [2: 0.40280774], [2: 0.41144702], [2: 0.42224622], [2: 0.4265659], [2: 0.4330454], [2: 0.43736497], [2: 0.44168466], [2: 0.44384444], [2: 0.44600433], [2: 0.4524838], [2: 0.46544278], [2: 0.47840175], [2: 0.4892008], [2: 0.4978402], [2: 0.50431967], [2: 0.50647944], [2: 0.50647944], [2: 0.50647944], [2: 0.50647944], [2: 0.50647944], [2: 0.51079917], [2: 0.5172786], [2: 0.5215982], [2: 0.5237581], [2: 0.5237581], [2: 0.5237581], [2: 0.5237581], [2: 0.5237581], [4: 0.0], [4: 0.07451397], [4: 0.07451397], [4: 0.10691138], [4: 0.1393088], [4: 0.1738661], [4: 0.20842329], [4: 0.24298048], [4: 0.28401726], [4: 0.32073426], [4: 0.35529158], [4: 0.3790496], [4: 0.39848804], [4: 0.41144702], [4: 0.42224622], [4: 0.4287257], [4: 0.4330454], [4: 0.43736497], [4: 0.44600433], [4: 0.4524838], [4: 0.46760258], [4: 0.48056152], [4: 0.4978402], [4: 0.51295894], [4: 0.5237581], [4: 0.5280777], [4: 0.53455716], [4: 0.54319656], [4: 0.54967606], [4: 0.5539956], [4: 0.55831534], [4: 0.562635], [4: 0.57343405], [4: 0.57991356], [4: 0.58639306], [4: 0.5907127], [4: 0.5907127], [4: 0.5907127], [4: 0.5928725], [4: 0.5928725], [4: 0.5928725], [5: 0.003239675], [5: 0.09179262], [5: 0.09179262], [5: 0.1393088], [5: 0.1738661], [5: 0.19330454], [5: 0.20842329], [5: 0.21706256], [5: 0.22570194], [5: 0.2343412], [5: 0.24298048], [5: 0.25161988], [5: 0.26241893], [5: 0.2775378], [5: 0.29265654], [5: 0.3034557], [5: 0.3142548], [5: 0.31857446], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426]]

我将如何将 randomData 过滤到一个变量 [[Int: Float]] 中,该变量返回每个键的最后一个对象。换句话说,预期的结果将是:

[[0: 0.3142548], [2: 0.5237581], [4: 0.5928725], [5: 0.32073426]]

我认为逻辑是为每个键创建数组,然后获取最后一个元素,并将其重新用于数组,但这只是拉最后一个元素,而不是每个键的最后一个元素

let filtered = randomData.filter({$0.keys == $0.keys}).last
// Optional([5: 0.32073426])

let filtered = randomData.map({$0.filter({$0.key == $0.key})}).last
//Optional([5: 0.32073426])

一如既往地感谢任何建议和指导。

标签: arraysswiftdictionaryfilter

解决方案


这可以通过根据内部字典键对元素进行分组,然后选择每个组的最后一个元素来完成

let selected = Dictionary(grouping: randomData, by: { $0.keys.first })
    .compactMap { $0.value.last }

正如@Alexander 在评论中所建议的那样,这可以更直接地使用Dictionary(_:uniqueKeysWith:)

let selected = Dictionary(randomData.flatMap { $0 }, uniquingKeysWith: {
    return $0 > $1 ?  $0 : $1
})

这两种解决方案产生的结果略有不同,第一个是字典数组,第二个是字典,如下所示

第一个解决方案: [[2: 0.5237581], [4: 0.5928725], [5: 0.32073426], [0: 0.3142548]]
第二个解决方案: [0: 0.3142548, 5: 0.32073426, 4: 0.5928725, 2: 0.5237581]


推荐阅读