排序数组有困难

时间:2019-06-01 15:27:58

标签: ios objective-c sorting nsmutablearray nsarray

我想按出现在每个数组对象不同位置的字符串排序。

我有一个包含以下对象的nsarray:

Jones John 05-12-1993 Diabetes *05-13-2019 **R ***No Data ****68xxx

Smith John 05-12-2019 Hypertension *05-12-2019 **R ***05-12-2019 ****117xx

Smithers John 05-12-1947 COPD *05-13-2019 **R ***05-13-2019 ****89xxx

Wilson John 05-13-2019 Atrial Fibrillation *05-13-2019 **R ***05-16-2019 ****90xxx

Davis Joe 05-23-1905 Hypertension *05-25-2019 **R ***05-23-2019 ****42xxx

我需要按单个星号后的日期对数组进行排序。我不知道该怎么做。我已经尝试了许多示例,但是没有用。有什么建议么?谢谢。

我已经尝试过了,当然,它仅按每个对象的开头进行排序

[self.nameAndDOB sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; // 1-5 sort patient roster by last name

3 个答案:

答案 0 :(得分:0)

localizedCaseInsensitiveCompare:是一种比较字符串的方法。显然,它并没有按照您想要的方式对它们进行比较。您应该接受的挑战是编写一个方法,该方法以要比较它们的方式比较字符串,并将该方法的选择器传递给sortUsingSelector:

我通常使用基于块的排序方法之一;更容易编写,更灵活。

答案 1 :(得分:0)

您可以做以下事情

答案 2 :(得分:0)

我将使用正则表达式提取日期字符串,将其转换为日期,然后对其进行排序。像这样:

let array = [
    "Jones John 05-12-1993 Diabetes *05-13-2019 **R ***No Data ****68xxx",
    "Smith John 05-12-2019 Hypertension *05-12-2019 **R ***05-12-2019 ****117xx",
    "Smithers John 05-12-1947 COPD *05-13-2019 **R ***05-13-2019 ****89xxx",
    "Wilson John 05-13-2019 Atrial Fibrillation *05-13-2019 **R ***05-16-2019 ****90xxx",
    "Davis Joe 05-23-1905 Hypertension *05-25-2019 **R ***05-23-2019 ****42xxx"
]
let patt = " \\*\\d\\d\\-\\d\\d\\-\\d\\d\\d\\d"
let regex = try! NSRegularExpression(pattern: patt, options: [])
let f = DateFormatter()
f.dateFormat = "mm/dd/yyyy"
let array2 = array.map { s -> Date in
    let r = 
        regex.firstMatch(in: s, options: [], range: NSRange(s.startIndex..., in: s))!.range
    let ss = 
        (s as NSString).substring(with: NSRange(location: r.location+2, length: r.length-2))
    return f.date(from:ss)!
}
let sorted = zip(array,array2).sorted{$0.1 < $1.1}.map{$0.0}

结果是

[
    "Smith John 05-12-2019 Hypertension *05-12-2019 **R ***05-12-2019 ****117xx", 
    "Jones John 05-12-1993 Diabetes *05-13-2019 **R ***No Data ****68xxx", 
    "Smithers John 05-12-1947 COPD *05-13-2019 **R ***05-13-2019 ****89xxx", 
    "Wilson John 05-13-2019 Atrial Fibrillation *05-13-2019 **R ***05-16-2019 ****90xxx", 
    "Davis Joe 05-23-1905 Hypertension *05-25-2019 **R ***05-23-2019 ****42xxx"
]

...我认为您会同意,这是基于您所说内容的正确答案。

但是,正如其他人所说的那样,最初提出的问题很愚蠢。首先,您不应该处理这些结构化字符串。您应该从一开始就将它们解析为自定义结构,并改为使用该结构的实例。