2014-12-22 3 views
4

Как сортируется массив по нескольким критериям в Swift? Например, массив словарей, как показано ниже:Swift Сортировка массива с несколькими критериями сортировки

items = [ 
    [ 
     "item":"itemA" 
     "status":"0" 
     "category":"B" 
    ],[ 
     "item":"itemB" 
     "status":"1" 
     "category":"C" 
    ],[ 
     "item":"itemC" 
     "status":"0" 
     "category":"A" 
    ],[ 
     "item":"itemD" 
     "status":"2" 
     "category":"A" 
    ] 
] 

Это должно быть отсортирован следующим образом:

  1. категории ASC
  2. статус DESC

Я успешно отсортирован этот массив на основе либо условие 1 ИЛИ 2, но не оба. Ниже приведен код для этого:

itemArray.sort({ 
     $0["category"] < $1["category"]) 
    }) 

Как его можно расширить, включив в него несколько критериев сортировки?

+2

Я не согласен, что это точный дубликат, поскольку речь идет о вводе словаря, а не о структуре (хотя это очень похоже). –

ответ

11

Вы хотите использовать лексикографическое сравнение, то есть если первые поля равны, сравните второе поле, в противном случае сравните первые поля.

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

let result = items.sorted { 
    switch ($0["category"],$1["category"]) { 
    // if neither “category" is nil and contents are equal, 
    case let (lhs,rhs) where lhs == rhs: 
     // compare “status” (> because DESC order) 
     return $0["status"] > $1["status"] 
    // else just compare “category” using < 
    case let (lhs, rhs): 
     return lhs < rhs 
    } 
} 

Там на самом деле lexicographicCompare, что вы могли бы использовать при некоторых обстоятельствах, чтобы сделать сравнение - но это не будет работать в этом случае, потому что а) OPTIONALS, в то время как их можно сравнить с <, не соответствуют Comparable, поэтому вам нужно будет вручную проверить нуль и b) вы хотите отсортировать вторую запись в порядке убывания.

+0

. Где-то (LHS) и .Some (RHS) сгенерированы/что они представляют? Я хотел бы лучше понять это, поэтому я могу добавить дополнительные критерии порядка сортировки за пределы двух в этом примере. –

+0

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

Смежные вопросы