删除swift中数组中重复的机场代码字符串

amrnrhlw  于 2023-01-25  发布在  Swift
关注(0)|答案(2)|浏览(107)

我有一个字符串数组,是机场代码,就像这样

let list = [ "JFK-ATL-CDG-JFK",
             "HKG-MIA-NRT",
             "LAX-DFW-FRA-CDG-AMS-FRA-DFW",
             "PEK-SEA-MCO-YYZ-SEA",
             "MSP-DTW-BKK"]

我想做的是只返回有重复机场代码的字符串,所以如果用户再次访问同一个城市,那么我希望该字符串在这样的数组中返回。

let updatedList = [ "JFK-ATL-CDG-JFK",
                    "LAX-DFW-FRA-CDG-AMS-FRA-DFW",
                    "PEK-SEA-MCO-YYZ-SEA"]

数组中的第二个和第三个元素没有重复的代码,因此不会在新数组中返回这些代码,请注意,机场代码由“-”分隔。Swift是否提供了删除“-”并将其添加回去的方法?最简单的方法是什么?谢谢。

vnzz0bqm

vnzz0bqm1#

你可以尝试一些简单的方法,对我很有效:

let list = [ "JFK-ATL-CDG-JFK",
             "HKG-MIA-NRT",
             "LAX-DFW-FRA-CDG-AMS-FRA-DFW",
             "PEK-SEA-MCO-YYZ-SEA",
             "MSP-DTW-BKK"]

var updatedList: [String] = []
list.forEach { item in
    let test = item.split(separator: "-").map{String($0)}
    if test.count != Set(test).count {
        updatedList.append(item)
    }
}
print("\n---> updatedList: \(updatedList) \n")

或者,更简洁地说:

let updatedList: [String] = list.compactMap{ item in
    let arrTest = item.split(separator: "-").map{String($0)}
    return arrTest.count != Set(arrTest).count ? item : nil
}
bfhwhh0e

bfhwhh0e2#

请注意,机场代码以“-”分隔,Swift是否提供了删除“-”并将其添加回来的方法?
这并不是破折号特有的(那会很傻,因为如果我想拆分逗号并将它们加回去呢?),但是是的,下面是我的建模方法:

import Foundation

extension Sequence where Element: Hashable {
    func hasDuplicates() -> Bool {
        var seenElements = Set<Element>()
        return !allSatisfy { element in
            let wasSeenBefore = seenElements.insert(element).inserted
            return wasSeenBefore
        }
    }
}

struct Route {
    let airports: [String]
    
    var hasRepetions: Bool { airports.hasDuplicates() }
}

extension Route {
    init(parsingFrom input: String) {
        self.init(airports: input.components(separatedBy: "-"))
    }
    
    func encodeToString() -> String {
        airports.joined(separator: "-")
    }
}

let list = [
    "JFK-ATL-CDG-JFK",
    "HKG-MIA-NRT",
    "LAX-DFW-FRA-CDG-AMS-FRA-DFW",
    "PEK-SEA-MCO-YYZ-SEA",
    "MSP-DTW-BKK",
]

let routes = list.map(Route.init(parsingFrom:))
let routesWithRepetitions = routes.filter(\.hasRepetions)
print(routesWithRepetitions)
print(routesWithRepetitions.map { $0.encodeToString() })

我建议你获取输入数据,在程序中尽早将其解析为一些模型对象,比如我在这里展示的Route,这种类型为放置hasRepetitions属性提供了一个非常自然的位置,然后你可以根据需要使用它来过滤输入。
如果你需要最后的输出再次变成字符串,那么就把你的模型对象序列化回string,但是只在最后一秒才这样做,这样你所有的路由处理代码就可以用做有用事情的Route对象来工作,而不是通用的String

相关问题