【问题标题】:Remove some elements from an array [duplicate]从数组中删除一些元素[重复]
【发布时间】:2017-07-15 14:29:34
【问题描述】:

我有以下情况,我需要从数组中删除一些元素。我有一个包含以下元素的数组:

[
    "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" 需要被视为相同,只保留其中一个并删除另一个。

我还没有找到可行的方法。我该怎么做?

【问题讨论】:

  • 这有太多的部分,现在太宽泛了。在高层次上,您需要解析字符串、标准化结果输出、过滤掉重复项并将结果返回到此原始格式。您应该找出其中哪一个给您带来麻烦,并就这些问题提出个别问题。

标签: arrays swift string swift3


【解决方案1】:

对于描述为的相等性:“白色和蓝色”和“蓝色和白色”元素需要被视为相同,为 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"]

【讨论】:

  • 非常感谢,这非常有效。
猜你喜欢
  • 1970-01-01
  • 2013-05-20
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多