2017-01-19 13 views
0

Я извлекаю данные из модели i.e Contacts. Затем я сортирую эту модель согласно свойству name. Но результат не пришел в порядке. Я использую следующий код для сортировки данных:Сортировка в Swift3

func filterArrayAlphabatically(contacts : [Contact]) 
    { 

     let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.map({ String($0)}) 

     let all_Contacts = contacts.sorted { $0.name < $1.name } //Sort model data as per name 

     var result = [String:[Contact]]() 

     for letter in alphabet 
     { 
      result[letter] = [] 

      for cntct in all_Contacts 
      { 
       let ctc : Contact! = cntct 
       let name : String! = ctc.name.capitalized 

       if name.hasPrefix(letter) 
       { 
        result[letter]?.append(cntct) 
       } 
      } 
     } 

     print("result......\(result)") 
    } 

Это дает мне выход, как:

result......["M": [], "K": [<App.Contact: 0x7c6703e0>], "E": [], "U": [], "Y": [], "H": [<App.Contact: 0x7c6701a0>], "X": [], "A": [<App.Contact: 0x7c670120>, <App.Contact: 0x7c670440>], "D": [<App.Contact: 0x7c6700b0>, <App.Contact: 0x7c670160>], "I": [], "R": [], "G": [], "P": [], "O": [], "L": [], "W": [], "C": [], "V": [], "J": [<App.Contact: 0x7c66f990>], "Q": [], "T": [], "B": [], "N": [], "Z": [], "S": [], "F": []] 

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

result......["A": [], "B": [<App.Contact: 0x7c6703e0>], "C": [], "D": []] 

Что я делаю не так? Или есть ли другие, чтобы сортировать его. Благодаря!

EDIT: Я попытался следующий код, чтобы сделать правильный заказ:

let sortedArray = result.sorted 
    { 
     (struc1, struc2) -> Bool in 
     return struc1.key < struc2.key 
    } 

Хорошо, это дает мне результат в правильном порядке, как я хочу. Но проблема в том, что я хочу его использовать, Но как я не знаю. Как у меня есть var arr_Contacts = [String:[Contact]](). Я хочу назначить sortedArray на номер arr_Contacts. Как я могу это сделать?

Когда я задаю это дает предупреждение, что это:

enter image description here

Это дает ошибку:

enter image description here

+3

Вы помещаете результаты в словарь, на который вводится первая буква. Словари неупорядочены. – Paulw11

+0

, вы можете изучить [NSOrderedDictionary] (https://cocoapods.org/pods/NSOrderedDictionary) – Fonix

+0

Да, как я могу сделать его в правильном порядке? – Amanpreet

ответ

1

Как уже говорилось, словарь неупорядоченный - если вам нужен упорядоченный представление данных, вы выбрали неправильную структуру данных. Массив намного лучше подходит для упорядоченных представлений.

Сделайте массив словарей или простых структур, которые объединяют стартовую букву с массивом контактов, начинающихся с этой буквы.

func filterArrayAlphabatically(contacts inputContacts: [Contact]) -> [[String: [Contact]]] 
{ 
    //Using this will remove any contacts which have a name not beginning with these letters, is that intended? 
    let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.map({ String($0) }) 

    // For strings use a localized compare, it does sensible things with accents etc. 
    let allContacts = inputContacts.sorted { $0.name.localizedCompare($1.name) == .orderedAscending } 

    //Now we're using an array of dictionaries, each of which will have a single key value pair [letter: [Array of contacts]] 
    var result = [[String: [Contact]]]() 

    for letter in alphabet 
    { 
     result.append([letter: contacts(beginningWith: letter, from: allContacts)]) 
    } 

    return result 
} 

func contacts(beginningWith prefix: String, from contactList: [Contact]) -> [Contact] { 
    //you could use a filter here for brevity, e.g. 
    //let contacts = contactList.filter { $0.name.capitalized.hasPrefix(prefix) } 
    //this is short enough to reasonably be used at the call site and not within a function 

    var contacts = [Contact]() 
    for contact in contactList { 
     if contact.name.capitalized.hasPrefix(prefix) { 
      contacts.append(contact) 
     } 
    } 
    return contacts 
} 

let contacts = [Contact(name: "Bob"), Contact(name: "Kate"), Contact(name: "Darling")] 
let filteredArray = filterArrayAlphabatically(contacts: contacts) 
print(filteredArray) 
//[["A": []], ["B": [Contact(name: "Bob")]], ["C": []], ["D": [Contact(name: "Darling")]], ["E": []], ["F": []], ["G": []], ["H": []], ["I": []], ["J": []], ["K": [Contact(name: "Kate")]], ["L": []], ["M": []], ["N": []], ["O": []], ["P": []], ["Q": []], ["R": []], ["S": []], ["T": []], ["U": []], ["V": []], ["W": []], ["X": []], ["Y": []], ["Z": []]] 
+0

Его работа !! Спасибо :) – Amanpreet

1

Попробуйте разобраться с этим форматированием.

class Contact { 
    var name: String = "" 
    var lastName: String = "" 

    public init (name: String, lastName: String){ 
     self.name = name 
     self.lastName = lastName 
    } 
} 

let contact1 = Contact(name: "V", lastName: "W") 
let contact2 = Contact(name: "G", lastName: "W") 
let contact3 = Contact(name: "A", lastName: "C") 
let contact4 = Contact(name: "P", lastName: "W") 
let contact5 = Contact(name: "F", lastName: "W") 
let contact6 = Contact(name: "A", lastName: "W") 
let contact7 = Contact(name: "A", lastName: "W") 
var contacts: [Contact] 

contacts = [contact1, contact2, contact3, contact4, contact5, contact6, contact7] 

let sortedContact = contacts.sorted{(struct1, struct2) -> Bool in 
    return struct1.name < struct2.name 
} 
//At this point our contact are sorted, now add to dictionnary 

var arr_Contacts = [String:[Contact]]() 
let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".characters.map({ String($0) }) 

for letter in alphabet { 
    arr_Contacts[String(letter)] = [] 
    let matches = sortedContact.filter({$0.name.characters.first == letter.characters.first}) 
    if !matches.isEmpty { 
     for contact in matches { 
      arr_Contacts[letter]?.append(contact) 
     } 
    } 
} 
//Dic are unordered data, so need to use an Array 
let sortedDic = Array(arr_Contacts).sorted{ (s1, s2) in 
    return s1.key < s2.key 
} 

Выход:

("A", [Contact, Contact, Contact])("B", [])("C", [])("D", [])("E", [])("F", [Contact])("G", [Contact])("H", [])("I", [])("J", [])("K", [])("L", [])("M", [])("N", [])("O", [])("P", [Contact])("Q", [])("R", [])("S", [])("T", [])("U", [])("V", [Contact])("W", [])("X", [])("Y", [])("Z", []) 
+0

У меня есть ** var arr_Contacts = [String: [Contact]]() ** и как я могу назначить этот ** sortedArray ** на ** arr_Contacts **. – Amanpreet

+0

@Amanpreet just yourDic = ["your_key_value": sortedArray] – Makaille

+0

дает ошибку. Проверьте обновленный вопрос. – Amanpreet

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