Swift:正在转换

Swift: Converting

我正在努力转换字典格式: 我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。

var items:[[String]] = [["a", "b"],["a", "c"],["b", "c"]]

var result:[[String:[String]]] = [
    ["a":["b","c"]],
     ["b":["c"]]
]

我曾尝试使用大量数组,但我一直在 xcode 中遇到错误。知道最好的方法是什么吗?

for in 循环似乎总是缺少一项。帮助将不胜感激。

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

var result = [String:[String]]()
items.forEach {
    if let entry = result[[=10=][0]] {
        result[[=10=][0]]?.append([=10=][1])
    } else {
        result[[=10=][0]] = [[=10=][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),因此您必须访问当前值使用 [=17=].

这段代码的结果将是

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

我假设了一个一般情况,其中 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])
            }
        }
    }
}