2015-10-07 2 views
0

У меня есть словарь номер строки, которая выглядит следующим образом:Swift: Сортировать Словарь Количество строк

let comph : [String : [String : String]] = [ 
      "1":["title" : "first title"], 
      "2":["title" : "second title"], 
      "10": ["title" : "last title"] 
      ] 

Тогда, когда сортировать мой словарь с помощью comph.sort { $0.0 < $1.0 } я получаю это:

let sortedComph = comph.sort { $0.0 < $1.0 } 
print(sortedComph) //["1":["title" : "first title"],"10": ["title" : "last title"],"2":["title" : "second title"]] 

Как может Я сортирую словарь так, чтобы он возвращал ключи в числовом порядке?

например: ["1":["title" : "first title"],"2":["title" : "second title"],"10": ["title" : "last title"]]

Спасибо

+0

Да, я понимаю, что мысль, я бы проверить, есть ли способ, чтобы заказать то, что у меня есть уже. Скорее всего, я буду использовать многомерный массив. – haveapk

ответ

2

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

Но, похоже, что этот парень написал OrderedDictionary в Swift, если вы заинтересованы:

Learning Swift: Ordered Dictionaries

Или, быстрое н грязное решением было бы извлечь ключи массива, сортировать их, затем перебирать массив и выполнять поиск по словарю с помощью клавиш.

+0

Да, я думаю, что лучше всего перейти к массиву – haveapk

0

, если вы хотите, вы могли бы иметь массив структуры, представляющий данные

struct Model 
{ 
    var key:String! 
    var title:String! 
    // etc... 
} 

Затем объявите массив этой структуры:

 var arrayOfStructure = [Model]() 

Затем отсортированный его

+0

Я никогда не думал об этом. превосходный пункт. – haveapk

+0

Хотя у этого будет заказ, он не будет отсортирован. Чтобы выполнить сортировку, вы также захотите, чтобы модель соответствовала Comparable, а затем выполнила сортировку в arrayOfStructure. –

0

sortedComph постоянная в вашем примере больше не словарь, а массив кортежей (ключ, значение). Проблема, с которой вы сталкиваетесь, заключается в том, что при сортировке строк сравнение выполняется без обработки строк как числовых значений. Это, что вам нужно исправить.

Один из способов справиться с этим путем создания Int? экземпляров из ваших строк в функции сравнения:

let sortedComph = comph.sort { Int($0.0) < Int($1.0) } 
// [("1", ["title": "first title"]), ("2", ["title": "second title"]), ("10", ["title": "last title"])] 

Таким образом, результирующий массив будет отсортирован по целому значению, что в строковых ключей. Любые не Integer-ключи будут сгруппированы в начале списка, так как сортируются nil.

Более надежный способ, вероятно, использовать NSString.compare(:options:) метод:

let sortedComph = comph.sort { 
    ($0.0 as NSString).compare($1.0, options: .NumericSearch) == .OrderedAscending 
} 
// [("1", ["title": "first title"]), ("2", ["title": "second title"]), ("10", ["title": "last title"])] 
Смежные вопросы