如何根据Swift中的字符散列字符串?

时间:2016-12-20 08:02:54

标签: ios swift

我有一个字符串输入INDIA。我想创建一个包含输入中不同字符及其频率的哈希。如何实现呢?

1 个答案:

答案 0 :(得分:0)

NSOrderedSet可能适合此目的,但问题(在此用例中)是它是一个无序集合(只是一个包),所以要维护输入字符串中的字符顺序生成哈希,需要添加一些修复,这将首先降低NSOrderedSet方法的可用性。

另一种方法是实现自己的“有序包”,它计算输入字符串中每个字符的频率,并生成一个包含2个元素元组(有序集合)的数组,其中第一个元组成员注释字符和第二个是输入字符串中该字符的计数。

extension Collection where Iterator.Element: Hashable {
    var frequencies: [(Iterator.Element, Int)] {
        var seen: [Iterator.Element: Int] = [:]
        var frequencies: [(Iterator.Element, Int)] = []
        for element in self {
            if let idx = seen[element] {
                frequencies[idx].1 += 1
            }
            else {
                seen[element] = frequencies.count
                frequencies.append((element, 1))
            }
        }
        return frequencies
    }
}

有了这个,您可以轻松计算自定义哈希:

extension String {
    // lowercase the String as not to differ between upper
    // and lower case characters when computing the hash
    var customHash: String {
        return lowercased().characters.frequencies
            .reduce("") { $0 + String($1.0) + String($1.1) }
    }
}

let str1 = "INDIA"
let str2 = "United Kingdom of Great Britain and Northern Ireland"

print(str1.customHash) // i2n1d1a1
print(str2.customHash) // u1n7i5t4e4d4 7k1g2o3m1f1r5a4b1h1l1