斯威夫特:转换

时间:2017-01-23 23:03:58

标签: swift swift-playground

我正在努力在字典格式之间进行转换: 我试图将下面的项数组转换为下面的结果数组。基本上通过在第一个元素中查找重复项,然后在第一个参数不同时仅将结果集添加到结果集中。

sed '/19:55/{
N
N
N
N
N
s/\n/ /g
}' file.txt

我尝试过使用多个阵列但是我的xcode中一直存在错误。知道最好的方法是什么吗?

for in循环似乎总是出现一个项目。非常感谢帮助。

2 个答案:

答案 0 :(得分:0)

如果result可以是字典 - 正如您在评论中提到的那样 - 您可以这样做:

var result = [String:[String]]()
items.forEach {
    if let entry = result[$0[0]] {
        result[$0[0]]?.append($0[1])
    } else {
        result[$0[0]] = [$0[1]]
    }
}

为了便于阅读,您还可以将其写为:

var result = [String:[String]]()
for item in items {
    if let entry = result[item[0]] {
        result[item[0]]?.append(item[1])
    } else {
      result[item[0]] = [item[1]]
    } 
}

items.forEach {...}与常规for..in循环基本相同,只是没有命名变量(在本例中为item),因此您必须访问当前值使用$0

此代码的结果将是

["a": ["b", "c"], "b": ["c"]]

答案 1 :(得分:0)

我假设一般情况下,item中的子数组可以包含多个字符串。这也允许items数组中的空数组。这给出了结果[" a":[" b"," c"," g"]," b" :[" c"]," c":[]]

func testThree() {
    let items = [["a", "b"],["a", "c", "g"],["b", "c"],["c"]]
    var result:[String:[String]] = [:]

    for arr in items {
        if(arr.count > 0) {
            let first = arr[0]
            if(result[first] != nil) {
                result[first]!.append(contentsOf: arr[1..<arr.count])
            } else {
                result[first] = Array(arr[1..<arr.count])
            }
        }
    }
}