首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift 3中为给定的订单字符串自定义排序数组

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

Stack Overflow用户
提问于 2017-03-23 09:54:52
回答 2查看 1.5K关注 0票数 0

寻找数组的排序

代码语言:javascript
复制
var myArray = ["Dog", "B-1", "C-1", "C-2", "C-3","Home"]

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

例如:哪里myCustomString = "DC"

输入阵列:

代码语言:javascript
复制
["Dog","Goat","C-1","C-2","C-3","Home"]

预期输出阵列:

代码语言:javascript
复制
["Dog", "C-1".."C-3","B-1","Home"] // sorted by myCustomString variable 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-25 03:18:04

如果将myCustomString转换为字符数组,则会更容易。使用Swift的String有点麻烦,因为订阅API太笨拙了。有一种方法可以做到:

Swift 3:

代码语言:javascript
复制
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拆分为两个子数组:一个包含所有您有订单的元素;另一个用于您没有排序的元素
  • 根据您指定的顺序对subArray1进行排序
  • 按字母顺序对subarray2排序
  • subArray1subArray2连接在一起,生成新的myArray

示例:

代码语言:javascript
复制
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)
票数 3
EN

Stack Overflow用户

发布于 2017-03-23 10:02:10

1)将"myCustomString“拆分为其字符组件

2)循环数组,将以先前拆分的字符开头的单词添加到自己的数组中。因此,在这个例子中,您将得到3个数组,一个以'D‘开头的字符串,一个以'C’开头的数组,以及其他不满足这两个条件的数组。

  • 创建数组字典(String : String),其中键是先前获得的单个字符(如'D‘、'C’等)
  • 创建一个额外的数组来保存那些不匹配的
  • 然后遍历输入数组,同时循环字典,以查看当前字符串是否以键中的字符开始。如果它与任何一个键不匹配,就将其放入额外的数组中。

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

4)将数组追加到1中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42972614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档