1. ホーム

[解決済み】Swiftで配列から重複する要素を削除する

2022-03-27 17:38:48

質問

以下のような配列があるかもしれません。

[1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]

あるいは、同じようなタイプのデータ部分の連続でも構いません。私がしたいのは、同じ要素がそれぞれ1つだけ存在することを保証することです。例えば、上記の配列は次のようになる。

[1, 4, 2, 6, 24, 15, 60]

2、6、15 の重複が削除され、同一の要素がそれぞれ1つだけ存在することが確認されたことに注意してください。Swiftはこれを簡単に行う方法を提供していますか、それとも自分で行わなければならないのでしょうか?

どのように解決するのですか?

例えばこんな風に、自分でロールバックすることができます。

func unique<S : Sequence, T : Hashable>(source: S) -> [T] where S.Iterator.Element == T {
    var buffer = [T]()
    var added = Set<T>()
    for elem in source {
        if !added.contains(elem) {
            buffer.append(elem)
            added.insert(elem)
        }
    }
    return buffer
}

let vals = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
let uniqueVals = uniq(vals) // [1, 4, 2, 6, 24, 15, 60]

また、拡張機能として Array :

extension Array where Element: Hashable {
    func uniqued() -> Array {
        var buffer = Array()
        var added = Set<Element>()
        for elem in self {
            if !added.contains(elem) {
                buffer.append(elem)
                added.insert(elem)
            }
        }
        return buffer
    }
}

あるいはもっとエレガントに(Swift 4/5)。

extension Sequence where Element: Hashable {
    func uniqued() -> [Element] {
        var set = Set<Element>()
        return filter { set.insert($0).inserted }
    }
}

どちらが使われるでしょうか。

[1,2,4,2,1].uniqued()  // => [1,2,4]