Swift中如何基于字典key合并相邻索引对应的字符串值?
实现方案
- 核心逻辑是先对选中的索引做连续序列分组,所有相邻的索引会被归到同一组,直接按组拼接单词即可,不需要处理两两拼接的重复问题。
实现步骤如下:
- 取出所有选中的索引并升序排序
- 将排序后的索引切分为多个连续的子序列,每个子序列对应一组相邻的选中单词
- 每组取最小索引作为合并后的key,组内所有索引对应的单词按顺序拼接为value,直接生成最终的合并字典
let text = "This is a test for merging adjacent words that the user has selected." // 拆分后的单词数组 var arrayOfString: [String] { text.components(separatedBy: " ") } // 用户选中的单词 var userSelectedWords: [Int:String] = [2 : "a", 3 : "test", 4 : "for", 6 : "adjacent", 7 : "words", 9 : "the", 11 : "has"] // 1. 排序选中的索引 let sortedKeys = userSelectedWords.keys.sorted() // 2. 对连续索引分组 var groups: [[Int]] = [] for key in sortedKeys { // 检查最后一个分组的最后一个元素是不是和当前索引连续 if let lastGroup = groups.last, let lastKey = lastGroup.last, lastKey + 1 == key { groups[groups.count - 1].append(key) } else { groups.append([key]) } } // 3. 生成合并后的选中字典 var mergedSelectedWords: [Int: String] = [:] for group in groups { guard let firstKey = group.first else { continue } // 按索引顺序取出所有单词拼接 let mergedWord = group.compactMap { userSelectedWords[$0] }.joined(separator: " ") mergedSelectedWords[firstKey] = mergedWord } // 测试输出 print(mergedSelectedWords) // 输出结果:[2: "a test for", 6: "adjacent words", 9: "the", 11: "has"]
如果需要更新原始的
userSelectedWords,直接把mergedSelectedWords赋值过去就行,也不需要额外维护要删除的索引列表,整个逻辑不依赖选中单词的数量,不管是2个还是N个连续单词都能正确合并。
内容的提问来源于stack exchange,提问作者Soundtwig
相关产品推荐
相关产品推荐

