按索引排序字符串数组

时间:2017-11-26 19:49:33

标签: arrays swift sorting swift4

我有一个字符串数组如下:

["\(title)|\(time)|\(length)|\(event)"]

["test1|00:24.42|SC Meters|50 Free", "test2|00:25.52|SC Yards|100 Free", "test3|00:26.73|SC Yards|100 Free", "test4|00:27.34|SC Yards|100 Free"]

我使用它按标题排序:

selectedSwimmerTimes = selectedSwimmerTimes.sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending }

我可以通过启动和停止索引对字符串数组进行排序吗?所以我可以使用上面的排序方法,除了不是按字母顺序基于第一个字母对字符串进行排序,而是按索引6到13对字符串进行排序。

我尝试过其他方法,例如拆分变量和迭代字典,但应用程序的其他代码需要这是一个字符串数组。

1 个答案:

答案 0 :(得分:2)

首先,它不是最好的做法,不使用struct或class,完全不建议将所有内容粘贴在单个字符串中,如他们提到的@WillMays和@Alexander,但现在已经不在了。

好吧,假设你在这里有一个名为Data的结构:

struct Data {

    var name : String
    var time : String
    var distance : String
    var price : String

}

定义sortType枚举:

enum sortType {
    case time
    case distance
}

你有这个方法,它将转换字符串数组并将每个字符串拆分为数据类型排序的结构,然后将其转换回字符串数组并返回它:

func splitAndParseArrayIntoStruct(type:sortType)->[String]{

    let soruceArray : [String] = ["test1|00:24.42|SC Meters|50 Free", "test2|00:25.52|SC Yards|100 Free", "test3|00:26.73|SC Yards|100 Free", "test4|00:27.34|SC Yards|100 Free"]
    var dataArray = [Data]()

    // convert the data into struct

    for data in soruceArray {

        let splitedData  = data.components(separatedBy: "|")

        // make sure you have these indices
        let dataObject = Data(name: splitedData[0], time: splitedData[1], distance: splitedData[2], price: splitedData[3])
        dataArray.append(dataObject)

    }

    // sort the data array
    let sortedDataArray = type == .time ? dataArray.sorted(by: { $0.time.compare($1.time) == .orderedAscending }) : dataArray.sorted(by: { $0.distance.compare($1.distance) == .orderedAscending })

    var newSourceArray = [String]()

    // recreate the normal array

    for data in sortedDataArray {

        newSourceArray.append("\(data.name)|\(data.time)|\(data.distance)|\(data.price)")

    }

    return newSourceArray

}

最后要做的是调用以下行,它将拆分并排序并返回新数组。

    let dataArray = self.splitAndParseArrayIntoStruct(type: .time)