【问题标题】:How to hash a string based on character in Swift?如何在 Swift 中基于字符散列字符串?
【发布时间】:2016-12-20 08:02:53
【问题描述】:

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

【问题讨论】:

  • 使用NSCountedSet 怎么样?
  • 你能指导我如何将它们与一些代码一起使用。
  • @AshutoshPandey 考虑就以下答案提供反馈:这解决了您的问题吗?

标签: ios swift


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2011-12-25
    • 2011-09-30
    • 2020-03-07
    • 2020-03-17
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多