Swift - 对数组中每个字符串中的字符进行排序

时间:2018-02-26 19:07:44

标签: arrays string sorting swift4

所以这个问题是对此问题的跟进:swift string permutations allowing the same strings

在那里,我询问了我可以使用一组已定义的字符串进行的所有可能的突变。我接下来要做的是过滤掉所有具有相同组合但结果不同的结果。

因此,如果输入为:["AB", "AC", "CA", "CB"],则输出应为["AB", "AC", "CB"],因为" AC"和" CA"拥有相同的构件。

所以我的想法是先按字母顺序对每个字符串进行排序,然后创建一个Set

我已经陷入了第一部分:(

let array = ["AB", "AC", "DC", "CA", "CB"]
print(type(of: array))
print(array)

let sortedArray = array.map{ $0.sorted() }
print(type(of: sortedArray))
print(sortedArray)

输出结果为:

Array<String>
["AB", "AC", "DC", "CA", "CB"]
Array<Array<Character>>
[["A", "B"], ["A", "C"], ["C", "D"], ["A", "C"], ["B", "C"]]

虽然我期待sortedArray:

["AB", "AC", "CD", "AC", "BC"]

然后我想把各个字符串加在一起:

print(array.map{ $0.joined() } )

导致ambiguous reference to member 'joined()'

但如何解决这个问题我不明白。

我也看到了这个:swift sort characters in a string,其中使用了以下代码:

var nonSortedString = "5121"
var sortedString = String(Array(nonSortedString.characters).sort())

但我不知道如何使用map和朋友(转换为Swift 4之后)应用

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:11)

如果你想获取一个字符串,对其字符进行排序,并从中构建一个新的字符串,在Swift 4中你可以:

let string = "foobar"

let sortedString = String(string.sorted())

结果是:

  

&#34; abfoor&#34;

所以,回到你原来的问题,你可以把字符串,这是一组排列,并构建一个排序的组合数组,如下所示:

let permutations = ["AB", "AC", "DC", "CA", "CB"]

// build set of combinations where each string has, itself, been sorted alphabetically

let combinations = Set(permutations.map { String($0.sorted()) })

// convert set (which removed duplicates) back to an array and sort it

let result = Array(combinations).sorted()

结果是:

  

[&#34; AB&#34;,&#34; AC&#34;,&#34; BC&#34;,&#34; CD&#34;]

答案 1 :(得分:3)

一种不同的方法...... 此解决方案使用reduce协议

中的另一个Sequence函数实现
let reduced = array.map({ String($0.sorted()) }).reduce(into: [String]() ){ (result, element)  -> Void in
    if !result.contains(element)
    {
        result.append(element)
    }
}.sorted()

print(reduced)

结果是......

  

[“AB”,“AC”,“BC”,“CD”]