【问题标题】:Sort Array of Strings by index按索引对字符串数组进行排序
【发布时间】:2017-11-26 19:49:33
【问题描述】:

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

["\(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 对字符串进行排序。

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

【问题讨论】:

  • 这可能会更好地创建一个名为 Swimmer 的结构,其中包含变量名称、时间、距离等。而不是让字符串包含所有信息。
  • @Martheli 那会让他们保持分组吗?假设我切换了索引 1 和 2,这意味着我也必须切换其他 3 个变量
  • 顺便说一句,这不是代码编写服务。您应该展示您尝试过的内容以及您面临的问题
  • @WillMays 编辑您的问题并发布您的尝试,解释您面临的问题
  • 这太疯狂了,你真的需要使用结构或类。不要只是将所有数据粘合到一个字符串中,使用起来会很麻烦!

标签: arrays swift sorting swift4


【解决方案1】:

首先,不使用 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
}

你得到了这个方法,它将转换字符串数组并将每个字符串拆分为 Data sorted 类型的结构,然后将其转换回字符串数组并返回:

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)

【讨论】:

  • 但是一旦我对时间进行排序,名称和距离的索引必须与时间保持一致
  • @WillMays 自从您按要求更新了您尝试的答案后,我更新了我的答案。
  • @Aaoli 这行得通!无论如何要将数据对象作为参数,所以我可以调用 splitAndSortSoruceArray(time) 以便对时间进行排序或 splitAndSortSoruceArray(distance)
  • 我强烈建议不要将结构成员初始化为""。默认为空字符串的正当理由非常少见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2012-10-14
  • 2011-12-17
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多