计算一个字符串中元音和辅音出现的次数

2017-08-10  本文已影响26人  落叶刺客
问题:给定一个字符串儿,如何计算它里面所包含的元音和辅音出现的次数?

  我们刚在上一篇笔记中学习了如何判断一个字符串儿中是否包含全部26个英文字母,接下来增加一点儿难度。还是以CGTN的头版新闻,金三胖威胁用导弹轰炸美国关岛为例,你能计算出下面这段字符串儿中包含多少个元音字母和多少个辅音字母?

The DPRK is working on plans for a missile strike near the US Pacific territory of Guam, calling President Donald Trump's warning of fire and fury a load of nonsense and that only absolute force can work on him.

  在解决这个问题之前,我们先来明确一下什么叫做元音字母,以及什么叫做辅音字母。我们都知道,在26个英文字母中,元音字母只有5个,分别是:A、E、I、O、U,然后剩下的就全部是辅音字母了。

  了解完什么是元音和辅音之后,我们再来解决这个问题。首先应该想到的处理方式是for ... in循环。遍历字符串儿中所有的字符,找到一个元音字符,就将元音字符的计数加1;找到一个辅音字符,就将辅音字符的计数加1。用代码表示为:

func challenge(input: String) -> (vowels: Int, consonants: Int) {
    
    // 创建元音字符集
    let vowels = CharacterSet(charactersIn: "aeiou")
    
    // 创建辅音字符集
    let consonants = CharacterSet(charactersIn: "bcdfghjklmnpqrstvwxyz")
    
    // 分别用于计算元音和辅音的个数
    var vowelCount = 0
    var consonantCount = 0
    
    // 将输入的字符全部转换成小写字母并且遍历
    for letter in input.lowercased().characters {
        
        // 将字母从Character类型强转为String类型
        let stringLetter = String(letter)
        
        // 分别判断是否存在元音字母和辅音字母
        if stringLetter.rangeOfCharacter(from: vowels) != nil {
            
            // 如果遍历的字母中存在元音字符,则计算元音字符的数量加1
            vowelCount += 1
            
        } else if stringLetter.rangeOfCharacter(from: consonants) != nil {
            
            // 如果遍历的字母中存在辅音字符,则计算辅音字符的数量加1
            consonantCount += 1
        }
    }
    
    // 返回元音字符和辅音字符的数量
    return (vowelCount, consonantCount)
}

let str = "The DPRK is working on plans for a missile strike near the US Pacific territory of Guam, calling President Donald Trump's warning of fire and fury a load of nonsense and that only absolute force can work on him."
challenge(input: str)  // vowels 61, consonants 109

  上面的代码主要用到了CharacterSet(charactersIn: )rangeOfCharacter(from: )这两个方法,其中CharacterSet是一个结构体,我们在《如何删除字符串中多余的空格》里已经做过简单的介绍,这里再做一个简单的说明:

CharacterSet.png

  CharacterSet主要是用来表示一组Unicode字符,它里面有好几个构造函数,我们今天用的主要是init(charactersIn string: ),它可以用给定的字符串儿来进行初始化。我们先用这个构造函数分别初始化了一个元音字符串集对象vowels,和一个辅音字符串儿集对象consonants,再用rangeOfCharacter(from: )从给定的字符集对象vowels和consonants中返回相应的元音字符或者辅音字符,如果返回成功(即结果不为nil),则相应的计数加1,最终计算出整个字符串儿中元音和辅音出现的总次数。

  再来一个思路跟上面一毛一样,但是判断方法不同的解决方案。我们的总体思路无非就是要检查某个遍历出来的字符是不是属于元音字符集vowels,或者辅音字符集consonants,所以在判断的时候除了可以使用rangeOfCharacter(from: )之外,还可以使用contains()。具体的代码如下:

func challenge(input: String) -> (vowels: Int, consonants: Int) {
        
        let vowels = "aeiou"
        let consonants = "bcdfghjklmnpqrstvwxyz"
        var vowelCount = 0
        var consonantCount = 0
        for letter in input.lowercased().characters {
            let stringLetter = String(letter)
            if vowels.contains(stringLetter) {
                
                // 如果vowels中包含字符stringLetter,则计数加1
                vowelCount += 1
            } else if consonants.contains(stringLetter) {
                
                // 如果consonants中包含字符stringLetter,则计数加1
                consonantCount += 1
            }
    }
        return (vowelCount, consonantCount)
}
上一篇下一篇

猜你喜欢

热点阅读