【问题标题】:Replace multiple words from a String based on the values in an Array根据数组中的值替换字符串中的多个单词
【发布时间】:2019-03-19 19:34:51
【问题描述】:

我有一个字符串数组和另一个字符串:

let array = ["one","two","three"]
let string = "one two three four five six seven"

什么是从字符串中删除数组中的匹配项的 Swifty 方法?我尝试了一个 for 循环,但想看看 filter 在这种情况下是否可以工作?

【问题讨论】:

标签: swift string


【解决方案1】:

我相信你想到的filter 表达式是这样的:

let finalString = string
    .split(separator: " ")  // Split them
    .lazy                   // Maybe it's very long, and we don't want intermediates
    .map(String.init)       // Convert to the same type as array
    .filter { !array.contains($0) } // Filter
    .joined(separator: " ") // Put them back together

【讨论】:

  • 如果你刚刚做了!array.contains(String($0),你可以摆脱.map
  • @LinusGeffarth 我最初是这样做的,并进行了编辑以使用地图。当与lazy结合时,它认为地图更加美观和明确。但我同意,它们非常相似,而且更多的是风格问题而不是实质问题。
【解决方案2】:

在 Swift 4.2 中有一个 removeAll(where: API。

let array = ["one","two","three"]
let string = "one two three four five six seven"

var components = string.components(separatedBy: " ")
components.removeAll{array.contains($0)}
let result = components.joined(separator: " ") // "four five six seven"

【讨论】:

    【解决方案3】:

    高效解决方案

    以下是一个有效的解决方案,将array中出现的元素及其周围的空格替换为一个空格:

    let array = ["one","two","three"]
    let str = "  eight one  four two   three five   six seven "
    var result = ""
    
    var i = str.startIndex
    
    while i < str.endIndex {
        var j = i
        while j < str.endIndex, str[j] == " " {
            j = str.index(after: j)
        }
        var tempo1 = ""
        if i != j { tempo1 += str[i..<j] }
    
        if j < str.endIndex { i = j } else {
            result += tempo1
            break
        }
    
        while j < str.endIndex, str[j] != " " {
            j = str.index(after: j)
        }
    
        let tempo2 = String(str[i..<j])
    
        if !array.contains(tempo2) {
            result += tempo1 + tempo2
        }
    
        i = j
    }
    
    print(result)  //␣␣eight␣four␣five␣␣␣six␣seven␣
    

    符号代表一个空格。


    基准

    Try it online!

    Vadian's      : 0.000336s
    JP Aquino's   : 0.000157s
    Rob Napier's  : 0.000147s
    This Solution : 0.000028s
    

    这比任何其他解决方案至少快 5 倍。


    保留空格

    如果您不想删除空格(因为它们不是原始数组的一部分),那么可以这样做:

    let array = ["one","two","three"]
    let str = "one two three four five six seven "
    var result = ""
    
    var i = str.startIndex
    
    while i < str.endIndex {
        var j = i
        while j < str.endIndex, str[j] == " " {
            j = str.index(after: j)
        }
    
        if i != j { result += str[i..<j] }
        if j < str.endIndex { i = j } else { break }
    
        while j < str.endIndex, str[j] != " " {
            j = str.index(after: j)
        }
    
        let tempo = String(str[i..<j])
    
        if !array.contains(tempo) {
            result += tempo
        }
    
        i = j
    }
    
    print(result)   //␣␣␣four five six seven␣
    

    【讨论】:

      【解决方案4】:
      let array = ["one","two","three"]
      let string = "one two three four five six seven"
      
      //Convert string to array
      var stringArray  = string.components(separatedBy: " ")
      
      //Remove elements from original array
      stringArray = stringArray.filter { !array.contains($0) }
      
      //Convert stringArray back to string
      let finalString = stringArray.joined(separator: " ")
      print(finalString)// prints "four five six seven"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2019-01-29
        • 1970-01-01
        • 2018-05-30
        • 2014-07-06
        相关资源
        最近更新 更多