Трудно сортировать этот массив - PullRequest
0 голосов
/ 01 июня 2019

Я хочу отсортировать по строке, которая появляется в разных местах в каждом объекте массива.

У меня есть 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 голосов
/ 01 июня 2019

Вы можете делать следующие вещи

0 голосов
/ 02 июня 2019

Я бы использовал регулярное выражение для извлечения строки даты, преобразования ее в дату и вычисления по ней. Как это:

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

... что, я думаю, вы согласитесь, это правильный ответ, основанный на ваших словах.

Однако, как уже говорили другие, исходная проблема в том виде, как она изложена, глупа. Вы не должны иметь дело с этими структурированными строками в первую очередь. Вы должны разобрать их в пользовательскую структуру в самом начале и вместо этого работать с экземплярами этой структуры.

0 голосов
/ 01 июня 2019

localizedCaseInsensitiveCompare: это метод, который сравнивает строки.Это явно не сравнивает их так, как вы хотите.Ваша задача, если вы примете это, состоит в том, чтобы написать метод, который сравнивает строки так, как вы хотите, чтобы они сравнивались, и передаете селектор метода в sortUsingSelector:

Я обычно используюодин из блочных методов сортировки;легче писать и более гибко.

...