【问题标题】:Having difficulty sorting this array排序这个数组有困难
【发布时间】:2019-10-17 20:47:29
【问题描述】:

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

我有一个包含如下对象的 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

【问题讨论】:

  • 您必须提取日期字符串(最好使用正则表达式)并对其进行排序。甚至更好地将字符串解析为具有适当属性的自定义类
  • 我强烈建议使用真正的自定义对象,而不是这样的字符串。具有姓名、姓氏、生日(?)日期、分析的对象?日期、症状等

标签: ios objective-c sorting nsmutablearray nsarray


【解决方案1】:

localizedCaseInsensitiveCompare:是一种比较字符串的方法。它显然不会按照您想要的方式比较它们。如果您接受它,您的挑战是编写一个方法,以 希望比较字符串的方式比较字符串,并将该方法的选择器传递给 sortUsingSelector:

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

【讨论】:

  • 我不明白。能否请您添加示例代码 sn-p?谢谢。
【解决方案2】:

你可以做以下事情

【讨论】:

    【解决方案3】:

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

    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"
    ]
    

    ...我想你会同意这是基于你所说的正确答案。

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

    【讨论】:

    • 我想你错过了这个问题被标记为objective-c,它缺少mapzip和元组的直接等价物;并且自定义结构建议可能不那么适用。不过,体面的 Swift 答案。
    • @CRD 我什么都没错过。语言无关紧要。 NSRegularExpression 和 NSDateFormatter 是 Foundation 的一部分。我描述了一种技术并证明它可以工作。
    • 好的,很高兴您没有错过任何内容,只是想提供帮助。但是,除非我们要在图灵完整性级别进行辩论,否则我必须有所不同,并说语言并非无关紧要。祝你有美好的一天。
    • 谢谢。我知道这个结构,并且有很多方法可以给猫剥皮,但我正在处理一个遗留应用程序的修复,所以现在,我需要处理我被处理的手;)
    • 这个概念看起来可行,但我对 swift 一无所知。任何人都可以在 Objc 中重现这个。我将不胜感激。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多