首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速检索第一个字典值

快速检索第一个字典值
EN

Stack Overflow用户
提问于 2018-09-11 14:38:10
回答 4查看 953关注 0票数 1

我有这种类型的字典:

代码语言:javascript
复制
var dict = [1: ["Value-1-1", "", ""],
            2: ["", "Value-2-2", "Value-2-3"], 
            3: ["Value-3-1", "Value-3-2", ""],
            4: ["Value-4-1", "", "Value-4-3"],
            5: ["", "", "Value-5-3"]]

我需要循环这个字典,只获得不是在每个键下为零的第一个值,并将它附加到数组中。

所以,最后,我的数组看起来应该是:

代码语言:javascript
复制
var array = ["Value-1-1", "Value-2-2", "Value3-1", "Value-4-1", "Value-5-3"]

我在这里读过这个问题-- SO Question,但它不包括空值,我想知道,如果没有地图,是否可以使用in或while循环?

如果有人能提供这类循环的代码示例,将不胜感激。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-09-11 14:48:19

这应该能起作用:

在学习编程时,它是一个很好的创举,可以使用手动循环,而不是像map()等神奇的方法,以算法的方式。它们确实是循环的,但它们是隐含的。

在这里,我使用了sorted() (因为否则它会有点长)。

我还使用了first(where:),它找到了第一个非空值.它也可以替换为while循环,但我不知道您是否希望使用for循环。

代码语言:javascript
复制
var dict = [1: ["Value-1-1", "", ""],
            2: ["", "Value-2-2", "Value-2-3"],
            3: ["Value-3-1", "Value-3-2", ""],
            4: ["Value-4-1", "", "Value-4-3"],
            5: ["", "", "Value-5-3"]]
var finalArray = [String]()
let keys = Array(dict.keys).sorted(by: { return $0<$1 }) // because keys aren't sorted
for aKey in keys {
    if let anArrayValue = dict[aKey], let firstNonEmptyValue = anArrayValue.first(where: { !$0.isEmpty }) {
        finalArray.append(firstNonEmptyValue)
    }
}
print("finalArray: \(finalArray)")

有关带有“更高级别”方法的版本,请参见@Martin R answer,但对于减缩(链接、闭包等)的理解要复杂得多。它也是这样做的,只是更紧凑,不那么明确。

票数 2
EN

Stack Overflow用户

发布于 2018-09-11 14:53:16

将字典按键排序以获得定义良好的顺序,这将给出一个键/值对数组。然后使用compactMap()first(where:)将每一对映射到值数组中的第一个非空字符串(如果存在的话):

代码语言:javascript
复制
let dict = [1: ["Value-1-1", "", ""],
            2: ["", "Value-2-2", "Value-2-3"],
            3: ["Value-3-1", "Value-3-2", ""],
            4: ["Value-4-1", "", "Value-4-3"],
            5: ["", "", "Value-5-3"]]


let array = dict.sorted(by: { $0.key < $1.key })
    .compactMap { $0.value.first(where: { !$0.isEmpty }) }

print(array) // ["Value-1-1", "Value-2-2", "Value-3-1", "Value-4-1", "Value-5-3"]
票数 4
EN

Stack Overflow用户

发布于 2018-09-11 14:49:42

这就是我解决它的方法,但它确实使用了flatMap:

代码语言:javascript
复制
var dict = [1: ["Value-1-1", "", ""],
            2: ["", "Value-2-2", "Value-2-3"],
            3: ["Value-3-1", "Value-3-2", ""],
            4: ["Value-4-1", "", "Value-4-3"],
            5: ["", "", "Value-5-3"]]

let newArray = dict.keys.flatMap({
    dict[$0]?.first(where: { !$0.isEmpty })
}).sorted()

print(newArray)

输出:

“值-1-1”、“值-2-2”、“值-3-1”、“值-4-1”、“值-5-3”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52278432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档