This question already has answers here:
Array filter in Swift3
(4个答案)
两年前关闭。
我有以下情况,我需要从数组中删除一些元素。我有一个数组,其元素如下:
[
    "white & blue", "white & red", "white & black",
    "blue & white", "blue & red", "blue & black",
    "red & white", "red & blue", "red & black",
    "black & white", "black & blue", "black & red",
    "white", "blue", "red", "black",
    "white & blue & red & black"
]

我需要将其转换为仅包含以下元素的数组:
[
    "white & blue", "white & red", "white & black",
    "blue & red", "blue & black",
    "red & black",
    "white", "blue", "red", "black",
    "white & blue & red & black"
]

在上面的示例中,元素"white & blue""blue & white"需要被视为相同,只保留其中一个元素,而删除另一个元素。
我还没有找到有效的方法。我该怎么做?

最佳答案

对于描述为:需要将“white&blue”和“blue&white”元素视为相同的元素,为Set定义的等式工作良好。
准备:

extension String {
    var colorNameSet: Set<String> {
        let colorNames = self.components(separatedBy: "&")
            .map {$0.trimmingCharacters(in: .whitespaces)}
        return Set(colorNames)
    }
}

"white & blue".colorNameSet == "blue & white".colorNameSet //== true

(假设每个颜色名称在每个元素中最多出现一次。)
还有一个Set,从数组中删除副本时,Set非常有用。
removing duplicate elements from an array
所以,你可以这样写:
let originalArray = [
    "white & blue", "white & red", "white & black", "blue & white",
    "blue & red", "blue & black", "red & white", "red & blue",
    "red & black", "black & white", "black & blue", "black & red",
    "white", "blue", "red", "black", "white & blue & red & black"]

func filterDuplicateColorNameSet(_ originalArray: [String]) -> [String] {
    var foundColorNameSets: Set<Set<String>> = []
    let filteredArray = originalArray.filter {element in
        let (isNew,_) = foundColorNameSets.insert(element.colorNameSet)
        return isNew
    }
    return filteredArray
}

print(filterDuplicateColorNameSet(originalArray))
//->["white & blue", "white & red", "white & black", "blue & red", "blue & black", "red & black", "white", "blue", "red", "black", "white & blue & red & black"]

09-10 01:40
查看更多