计算Swift字符串中的字符频率

时间:2017-07-14 08:29:27

标签: swift

我想将java代码转换为快速面对问题。任何帮助表示赞赏。

Java代码:

 for(String s: str){
          char arr[] = new char[26]

            for(int i =0;i< s.length(); i++){
                arr[s.charAt(i) -'a']++;
            }
}

Swift Code:

以下是扩展和课程。

extension String {
    var asciiArray: [UInt32] {
        return unicodeScalars.filter{$0.isASCII}.map{$0.value}
    }
}
extension Character {
    var asciiValue: UInt32? {
        return String(self).unicodeScalars.filter{$0.isASCII}.first?.value
    }
}


class GroupXXX{

    func groupXXX(strList: [String]){

        for str in strList{

        var charArray = [Character?](repeating: nil, count: 26)
        var s = str.characters.map { $0 }

        for i in 0..<s.count{
            charArray[(s[i].asciiValue)! - ('a'.asciiValue)!]++
        }

        }

    }
}

错误:

single-quoted string literal found, use '"' charArray[(s[i].asciiValue)! - ('a'.asciiValue)!]++ ^~~ "a"

2 个答案:

答案 0 :(得分:2)

Swift代码中存在几个问题:

  • Swift中没有单引号字符文字(已经是explained by JeremyP)。
  • 已在Swift 3中删除++运算符。
  • s[i]无法编译,因为Swift字符串未被索引 整数。
  • 将数组定义为[Character?]没有任何意义,你也做不到 增加Character?。 Swift相当于Java char 将是UInt16
  • 您不会检查角色是否在&#34; a&#34; ...&#34; z&#34;。

显然你想要计算出现次数 每个角色&#34; a&#34;到&#34; z&#34;在一个字符串中。 这就是我在Swift中的表现:

  • 定义&#34;频率&#34;数组为整数数组。
  • 枚举字符串的unicodeScalars属性。
  • 使用switch语句检查有效的字符范围。

然后不再需要自定义扩展,代码变为

var frequencies = [Int](repeating: 0, count: 26)
for c in str.unicodeScalars {
    switch c {
    case "a"..."z":
        frequencies[Int(c.value - UnicodeScalar("a").value)] += 1
    default:
        break // ignore all other characters
    }
}

答案 1 :(得分:1)

charArray[(s[i].asciiValue)! - ('a'.asciiValue)!]++

正如错误所说,使用双引号,Swift没有区分字符和字符串的语法(字符本身可能是swift中的字节序列)。

如果编译器无法区分,您可能需要明确强制该字符为Character

charArray[(s[i].asciiValue)! - (Character("a").asciiValue)!]++