搜索包含在数组Swift 4.x中的子字符串的字符串数组

搜索包含在数组Swift 4.x中的子字符串的字符串数组,swift,string,substring,Swift,String,Substring,我想找到所有以重复开头的字符串(“A1A2”,“A1B1”)(“B1A1”,“B1C1”) 数组会发生变化。它并不总是一样的 如何搜索包含子字符串的字符串数组? 谢谢任何帮助。 如果你不需要考虑复杂性,你可以使用还原(进::)/>代码>方法: ["A2A1", "A1A2", "A1B1", "B1A1", "B1C1", "C1B1", "D3E3", "E4E3", "E3D3", "E3E4"] 编辑感谢Rob建议使用默认参数订阅字典。我不知道给定列表有多长,但假设它可能很大 在这种情况

我想找到所有以重复开头的字符串(“A1A2”,“A1B1”)(“B1A1”,“B1C1”)

数组会发生变化。它并不总是一样的

如何搜索包含子字符串的字符串数组?

谢谢任何帮助。

如果你不需要考虑复杂性,你可以使用<代码>还原(进::)/>代码>方法:

["A2A1", "A1A2", "A1B1", "B1A1", "B1C1", "C1B1", "D3E3", "E4E3", "E3D3", "E3E4"]

编辑感谢Rob建议使用默认参数订阅字典。

我不知道给定列表有多长,但假设它可能很大

在这种情况下,从查找的角度来看,使用字典进行减少将是有效的

let array = ["A2A1", "A1A2", "A1B1", "B1A1", "B1C1", "C1B1", "D3E3", "E4E3", "E3D3", "E3E4"]
let result = array.reduce(into: [String: [String]]()) { (dict, element) in
  let key = String(element.prefix(2))
  dict[key, default:[]].append(element)
}

这使您可以将具有重复前缀的所有元素放入一维数组中:

let list = ["A2A1", "A1A2", "A1B1", "B1A1", "B1C1", "C1B1", "D3E3", "E4E3", "E3D3", "E3E4"]

var mapped = list.reduce(into: [String: [String]]()) { (dict, item) in
    let substr = String(item.prefix(2))
    dict[substr, default: []].append(item)
}

let res = Array(mapped.values).filter { $0.count > 1 }
debugPrint(res)

给定

你可以做:

let strings = ["A2A1", "A1A2", "A1B1", "B1A1", "B1C1", "C1B1", "D3E3", "E4E3", "E3D3", "E3E4"]
这将返回:

[“A1”:[“A1A2”,“A1B1”],“E3”:[“E3D3”,“E3E4”],“B1”:[“B1A1”,“B1C1”]

或者,如果您只希望副本作为数组:

let duplicates = Dictionary(grouping: strings) { $0.prefix(2) }
    .filter { $0.value.count > 1 }
这将返回:

[“B1A1”、“B1C1”]、[“E3D3”、“E3E4”]、[“A1A2”、“A1B1”]]

或者,如果您只需要平面阵列:

let duplicates = Dictionary(grouping: strings) { $0.prefix(2) }
    .filter { $0.value.count > 1 }
    .map { $0.value }
返回

[“B1A1”、“B1C1”、“A1A2”、“A1B1”、“E3D3”、“E3E4”]


字符串总是有这种形式吗?是的。形式是一样的。因此,解决方案的第一步是:为什么不编写一些简单的代码将
“A2A1”
解析为
(“A2”,“A1”)
是的……这比我现在展示的要复杂一点。我可以分多个步骤来完成。这是一个选项。或者过滤字符串,然后检查前缀。但是向这个过程添加额外的步骤会增加所有问题。如果我可以在一个循环中完成,然后继续,这将非常有帮助。但是谢谢。编程不是这样工作的。你应该把复杂的数据分解成更容易处理的更简单的数据,并把复杂的问题分解成更简单的问题。这样你就可以更容易地解决它们,你的代码也变得更可重用,因为虽然你不太可能遇到复杂的问题xact问题再次出现,您更有可能再次遇到相同的子问题,因此您可以重用该代码。无论是单循环还是非单循环都是无关紧要的。此代码应该包含在它自己的一组单独函数中。非常漂亮。非常感谢。解决一个问题。233265更多问题!!很有魅力。不客气!然后您可能想要k例如,当原始数组有两次“A1B1”时,eep只有唯一的值。你可以通过将数组转换为一个集合然后再返回到一个数组来轻松做到这一点。但我确信这不是唯一的方法。对于大型数组,这将扩展得非常糟糕。它对每个谓词执行两个
O(n)
操作,它们本身运行
O(n)
次,使此
O(n^2)是的,你是对的,我在这里没有考虑复杂度。非常感谢。我可能也会用这个代码来解决另一个问题。LOL。我很感激花费的时间。这也是有效的。我只是用下面的解决方案。再次谢谢。是的,字典对大的项目很有帮助。这一个数据集是SMA。我再次将此页面添加为书签,以备将来参考。您可以在将值升级到数组之前对其进行筛选(以节省复制)。此外,自Swift 4以来,随着
let duplicates = Dictionary(grouping: strings) { $0.prefix(2) }
    .filter { $0.value.count > 1 }
    .map { $0.value }
let duplicates = Dictionary(grouping: strings) { $0.prefix(2) }
    .filter { $0.value.count > 1 }
    .flatMap { $0.value }