我有一个字符串数组如下:
["\(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对字符串进行排序。
我尝试过其他方法,例如拆分变量和迭代字典,但应用程序的其他代码需要这是一个字符串数组。
答案 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)