2017-01-23 109 views
1

我正在努力轉換字典格式: 我想將下面的項目數組轉換爲下面的結果數組。本質上,通過查找項目第一個元素中的重複項,然後僅在第一個參數不同時將文件添加到結果集中。Swift:轉換

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

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

我已經嘗試使用衆多的數組,但是我一直打我的xcode中的錯誤。任何想法最好的方法是什麼?

For for循環似乎總是出現一個項目短。幫助將不勝感激。

+0

結果是否必須是一個數組,或者它可以只是一個字典。 var結果:[String:[String]] = [ 「a」:[「b」,「c」], 「b」:[「c」] ]? – ptoinson

+0

其實字典也可以工作 –

+0

爲什麼你有一個由2個元素數組組成的數據結構?有些東西似乎很腥...... – Alexander

回答

0

我假設其中一項子陣列可以比上串更一般的情況下。這也允許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]) 
      } 
     } 
    } 
} 
+0

爲什麼所有的冗餘類型註釋? – Alexander

+0

沒理由。如果你喜歡,可以刪除它們 – ptoinson

+0

他們在斯威夫特通常不鼓勵,除非他們實際上貢獻足夠的清晰度值得視覺負擔 – Alexander

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"]] 
+0

謝謝我不熟悉items.foreach語法 - 謹慎地用一些更簡單的術語來解釋它,或者鏈接到我可以閱讀的地方? –

+0

@MobileBloke我添加了一個等價的替代(我實際上更喜歡自己),並鏈接到forEach(_ :)'函數的文檔。 – Keiwan