2017-12-04 9 views
1

私はSwift 4、Xcode 9を使用しています。[((Int、String)]]を[(Int、String)]に結合するエレガントな方法ですか?

特に、私は配列[[ .joined(セパレータ: ";")を使用します。

データは次のようになります。

[[1,"My Name;Item1;Item2"], [(5,"My Name;Item2;Item3"), (3,"My Second Name;Item1")]] 

私はなるように内側の配列を組み合わせたい:

  1. のIntは名前に基づいて一致するアイテムを追加します(最大「;」)
  2. 文字列は、私の上記の例べきリットルを組み合わせる

を、後続の項目を追加しない場合は、既に存在これまでにead:

[(6,"My Name;Item1;Item2;Item3"), (3,"My Second Name;Item1")] 

Ie.入力は[[(Int, String)]]で、出力は[(Int, String)]

です。現在、かなり複雑なループによってこれを達成できます。データセットが大きいと、パフォーマンスが著しく低下します。私が要求しているように、これらの配列を組み合わせるエレガントでシンプルな方法はありますか?

ありがとうございました!

答えて

3

(一般的に、それは質問に答えていないので、私はこのコメントになるだろうが、それはあなたがこれを変更する必要があります正確にどのように説明するために、トラブルの価値が感じている。)

これは確かに可能ですが、しないでください。答えは、これを構造体の配列で置き換えることです。あなたのデータ記述に基づいて:

struct Element { 
    let rank: Int 
    let name: String 
    let items: Set<String> // Since you seem to want them to be unique and unordered 
} 

let elements: [[Element]] = 
    [[Element(rank: 1, name: "My Name", items: ["Item1", "Item2"])], 
    [Element(rank: 5, name: "My Name", items: ["Item2", "Item3"]), 
     Element(rank: 3, name: "My Second Name", items: ["Item1"])]] 

// You want to manage these by name, so let's make key/value pairs of all the elements 
// as (Name, Element) 
let namedElements = elements.joined().map { ($0.name, $0) } 

// Now combine them as you describe. Add the ranks, and merge the items 
let uniqueElements = 
    Dictionary<String, Element>(namedElements, 
           uniquingKeysWith: { (lhs, rhs) -> Element in 
            return Element(rank: lhs.rank + rhs.rank, 
                name: lhs.name, 
                items: lhs.items.union(rhs.items)) 
    }) 

// The result is the values of the dictionary 
let result = uniqueElements.values 

// Element(rank: 6, name: "My Name", items: Set(["Item3", "Item2", "Item1"])) 
// Element(rank: 3, name: "My Second Name", items: Set(["Item1"])) 
+0

これは私のロジックをリダイレクトするために幻想的で、それ以上のものに見えます。私は一度テストすると正しいとマークします。 – Coltuxumab

+1

美しく動作します。私が変えなければならなかったことの1つは戻り要素ランクでした。何らかの理由で、lhs.rank + rhs.rankが文脈がなくてもあいまいであるというエラーを私に与えました。私はlet sum = lhs.rank + rhs.rankをリターンの直前に加え、rankの値としてsumを使用することでこれを修正しました。ありがとうございました! – Coltuxumab

関連する問題