在Swift 3中为给定的顺序字符串自定义排序数组

时间:2017-03-23 09:54:52

标签: arrays sorting swift3

想要对数组进行排序

var myArray = ["Dog", "B-1", "C-1", "C-2", "C-3","Home"]

以给定的字符串顺序排列。

例如:myCustomString = "DC"

输入数组:

["Dog","Goat","C-1","C-2","C-3","Home"]

预期输出数组:

["Dog", "C-1".."C-3","B-1","Home"] // sorted by myCustomString variable 

2 个答案:

答案 0 :(得分:2)

如果将myCustomString转换为字符数组会更容易。由于订阅API非常笨拙,因此使用Swift的String会让人感到痛苦。这是一种方法:

Swift 3:

var myArray = ["Dog", "B-1", "C-1", "C-2", "C-3","Home"]
let myCustomString = "DC".characters.map { $0 }

myArray.sort { str1, str2 in
    let index1 = str1.isEmpty ? nil : myCustomString.index(of: str1[str1.startIndex])
    let index2 = str2.isEmpty ? nil : myCustomString.index(of: str2[str2.startIndex])

    switch (index1, index2) {
    case (nil, nil):
        return str1.compare(str2, options: .numeric) == .orderedAscending
    case (nil, _):
        return false
    case (_, nil):
        return true
    default:
        if index1 != index2 {
            return index1! < index2!
        } else {
            return str1.compare(str2, options: .numeric) == .orderedAscending
        }
    }
}

print(myArray)

原始答案:

  • myArray拆分为2个子阵列:其中一个包含您订购的所有元素;和一个你没有
  • 的元素
  • 根据您指定的顺序排序subArray1
  • 按字母顺序排序subarray2
  • 连接subArray1subArray2以制作新的myArray

示例:

let myOrder = "DC".characters.map { $0 }
var myArray = ["Dog", "B-1", "C-1", "C-2", "C-3", "Home"]
var subArray1 = [String]()
var subArray2 = [String]()

myArray.forEach {
    if $0.isEmpty || !myOrder.contains($0[$0.startIndex]) {
        subArray2.append($0)
    } else {
        subArray1.append($0)
    }
}

subArray1.sort { str1, str2 in
    let firstChar1 = str1[str1.startIndex]
    let firstChar2 = str2[str2.startIndex]

    let index1 = myOrder.index(of: firstChar1)!
    let index2 = myOrder.index(of: firstChar2)!

    if index1 != index2 {
        return index1 < index2
    } else {
        return str1.compare(str2, options: .numeric) == .orderedAscending
    }
}

subArray2.sort { $0.compare($1, options: .numeric) == .orderedAscending }

myArray = subArray1 + subArray2

print(myArray)

答案 1 :(得分:1)

1)拆分&#34; myCustomString&#34;进入其角色组件

2)循环数组,将以先前拆分的字符开头的单词添加到自己的数组中。因此,对于这个例子,你最终会得到3个数组,一个是以&#39; D&#39;开头的字符串,一个是以&#39; C&#39;以及其他任何不满足这两个条件的事情。

  • 创建一个数组字典(String:[String]),其中&#39;键&#39;是以前获得的单个字符(如&#39; D&#39;,&#39; C&#39;等)

  • 制作一个额外的数组,以容纳那些与任何

  • 不匹配的数组
  • 然后循环遍历输入数组,同时循环字典以查看当前字符串是否以键中的字符开头。如果它没有匹配任何键,请将其放在额外的数组中。

3)单独对每个数组进行排序

4)将数组追加到1