【问题标题】:Getting first letter from the string of first two words从前两个单词的字符串中获取第一个字母
【发布时间】:2017-09-27 09:10:23
【问题描述】:

我的字符串喜欢:

Apple recipe  recapes

Mango Tengaer

Lemone T U

Grapes limoenis  Steyic genteur

所以我尝试的是:

if let bakery = filtered?[indexPath.row]{
   let stringInput = bakery.fruitsname
                let stringInputArr = stringInput.components(separatedBy: " ")
                var stringNeed = ""

                for string in stringInputArr {
                    stringNeed = stringNeed + String(string.characters.first!)
                }

    print(stringNeed)  // have to print first word first letter, second word second letter

}

但对我来说,当我为我的第三个 Lemone T U 单词做这行时,我会在这条线上崩溃。在这条线上:

 stringNeed = stringNeed + String(string.characters.first!)

任何帮助!

谢谢

Output i expect as per my above words


AR
MT
LT
GL

【问题讨论】:

  • "My string like :" 那是一个字符串,还是一个字符串数组?

标签: ios swift string xcode9


【解决方案1】:

只需要检查数组计数

var array =  [
"Apple recipe  recapes",
"Mango Tengaer",
"Lemone  T U",
"Grapes limoenis  Steyic genteur"]

for str in array {
    let wordArray = str.split(separator: " ")
    if wordArray.count >= 2 {
        let firstTwoChar = String(wordArray[0].first!)+String(wordArray[1].first!)
        print(firstTwoChar)
    }
}

输出:

Ar
MT
LT
Gl

【讨论】:

  • 你的代码编译了吗?它在第三个对象中崩溃。
  • 输出是我从操场控制台中取出的,即使有 2 个空格也不会崩溃
【解决方案2】:

试试这个。它将字符串分成字符串数组并删除 nil。因此,如果字符串有双倍空格,它会过滤它。确保字符串至少包含 2 个单词。

if let bakery = filtered?[indexPath.row]{
   let stringInput = bakery.fruitsname
   if stringInput.components(separatedBy: " ").count >= 2 {
         let stringNeed = (stringInput.components(separatedBy: " ").map({ $0.characters.first }).flatMap({$0}).reduce("", { String($0) + String($1) }) as NSString).substring(to: 2)
    print(stringNeed)  
  }
}

【讨论】:

  • 看起来更好的解决方案
【解决方案3】:

这应该适用于 Swift 4

String(actualString.components(separatedBy: " ").compactMap { $0.first }).uppercased()

【讨论】:

    【解决方案4】:

    检查第一个字母的可选可能有额外的空间添加到它

    if let bakery = filtered?[indexPath.row]{
     let stringInput = bakery.fruitsname
            let stringInputArr = stringInput.components(separatedBy: " ")
            var stringNeed = ""
    
                    for string in stringInputArr {
    
     //Check the optional
                    if let first = string.characters.first{
                        stringNeed = stringNeed + String(first)
    
                    }
                }
    
    }
    

    【讨论】:

      【解决方案5】:

      试试这个:(我添加了前缀 2,所以如果只有单个元素,它只会计算前 2 个元素,然后不用担心它不会崩溃)

      if let bakery = filtered?[indexPath.row]{
           let stringInput = bakery.fruitsname
                  let stringInputArr = stringInput.components(separatedBy: " ")
                  var stringNeed = ""
      
                  for string in stringInputArr.prefix(2) //returns only first two elements {
      
                   if let strFirst = string.characters.first{
                         stringNeed += String(strFirst)
                     }
              }
      
      }
      

      【讨论】:

        【解决方案6】:

        这是我的解决方案,实际上您在开始时拥有一个 String 对象数组。

        let myStrings:[String] = ["Apple recipe  recapes","Mango Tengaer", " Lemone T U", "Grapes limoenis", "Steyic genteur", "He"]
        
        var retStr = "";
        for (_, str) in myStrings.enumerated()
        {
            let stringInOneLine = str.components(separatedBy: CharacterSet.whitespaces).filter({$0.count > 0}).map({String($0.first!).uppercased()}).prefix(2).joined()
        
            //Separate all components by white spaces
            let c1 = str.components(separatedBy: CharacterSet.whitespaces)
            print("c1: \(c1)")
        
            //Remove components that are empty: It happens in case there is double spaces for instance
            let c2 = c1.filter({$0.count > 0})
            print("c2: \(c2)")
        
            //Get only the first letter and in upper case
            let c3 = c2.map({String($0.first!).uppercased()})
            print("c3: \(c3)")
        
            //Keep only the first two elements (if there is more or less than 2, it's takend care of
            let c4 = c3.prefix(2)
            print("c4: \(c4)")
        
            //Reform the String with the first letters
            let string = c4.joined()
            print("string: \(string)")
        
        
        
            retStr.append(stringInOneLine)
            retStr.append("\n")
            print("stringInOneLine:\n\(stringInOneLine)")
        }
        
        print("retStr:\n\(retStr)")
        

        如果需要,retStr 的构造方式可以很容易地改变(如果你想要一个字符串数组)。 我通过解释每次调用的原因分解了stringInOnLine 构造。 然后,这取决于您的 Swift 专业水平和全局编程/算法技能,以决定您是喜欢将所有内容链接在一行中还是在多行中进行。 它有助于说明如何分解链式调用(以调试、理解或创建它们)。

        【讨论】:

          【解决方案7】:

          乍一看可能有点奇怪,但它确实为您完成了工作(我并不是说它是最有效的解决方案):

          var input: [String] =  ["apple recipe recapes", "Mango Tengaer", "Lemone  T U", "Grapes   limoenis   Steyic genteur", "One", "A B"]
          var result = input.filter { $0.contains(" ") && $0.characters.count > 0 }.map { String($0.first!).uppercased() + $0.substring(with: $0.range(of: "( \\w{1})", options: .regularExpression, range: $0.startIndex..<$0.endIndex)!).uppercased().trimmingCharacters(in: CharacterSet(charactersIn: " ")) }
          

          而实际的result 是:

          ["AR", "MT", "LT", "GL", "AB"]
          

          注意: 它会忽略单个单词或空字符串,但我想你也可以为它们扩展它,如果这是一个要求,很容易,它不处理只有空格的输入字符串,正如您在测试中看到的那样。

          【讨论】:

            【解决方案8】:

            如果您在一个句子中只有两个单词,这应该可以工作。

            String(fullName.components(separatedBy: " ").compactMap { $0.first })
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-07-11
              • 1970-01-01
              • 1970-01-01
              • 2013-09-04
              • 2018-05-11
              • 2016-06-03
              • 2015-12-21
              相关资源
              最近更新 更多