我有这种类型的字典:
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 array = ["Value-1-1", "Value-2-2", "Value3-1", "Value-4-1", "Value-5-3"]我在这里读过这个问题-- SO Question,但它不包括空值,我想知道,如果没有地图,是否可以使用in或while循环?
如果有人能提供这类循环的代码示例,将不胜感激。谢谢!
发布于 2018-09-11 14:48:19
这应该能起作用:
在学习编程时,它是一个很好的创举,可以使用手动循环,而不是像map()等神奇的方法,以算法的方式。它们确实是循环的,但它们是隐含的。
在这里,我使用了sorted() (因为否则它会有点长)。
我还使用了first(where:),它找到了第一个非空值.它也可以替换为while循环,但我不知道您是否希望使用for循环。
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,但对于减缩(链接、闭包等)的理解要复杂得多。它也是这样做的,只是更紧凑,不那么明确。
发布于 2018-09-11 14:53:16
将字典按键排序以获得定义良好的顺序,这将给出一个键/值对数组。然后使用compactMap()和first(where:)将每一对映射到值数组中的第一个非空字符串(如果存在的话):
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"]发布于 2018-09-11 14:49:42
这就是我解决它的方法,但它确实使用了flatMap:
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”
https://stackoverflow.com/questions/52278432
复制相似问题