2014-11-08 4 views
6

Я очень новичок в Swift и Objective-C.Swift: Сортировка массива в алфавитном порядке

У меня есть контроллер представления таблицы, в которой я объявленный словарь и массив:

var parts = [:] 
var partsSectionTitles: NSArray! 

В моей функции viewDidLoad, у меня есть:

parts = [ 
     "Part 1" : ["X:1", "X:2", "X:3"], 
     "Part 2" : ["X:1", "X:2"], 
     "Part 3" : ["X:1"] 
    ] 

var partsSectionTitles = parts.allKeys 

Я уже успешно это контроллер табличного представления в Objective-C, а также для сортировки частей секций в алфавитном порядке, я использовал:

partsSectionTitles = [[parts allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

Итак, мой вопрос: как написать предыдущий код Objective-C в Swift? Заранее благодарю за ваши ответы.

ОБНОВЛЕНИЕ: Я смог решить проблему, используя бит и куски из ответов, которые вы предоставили вам. Так что спасибо тебе! Вот что у меня есть:

Я объявил части словаря, как:

var parts = [String:[String]]() 

, что позволило мне предоставить несколько значений для каждого ключа. Это была ОГРОМНАЯ помощь.

Тогда я был в состоянии создать partsSectionTitles и сортировать его:

partsSectionTitles = [String](parts.keys) 
partsSectionTitles.sort(){ $0 < $1 } 

Это работало, как я не получил никаких ошибок.

+0

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

+1

Если случайно вы ничего не пробовали, взгляните на глобальную функцию сортировки Swifts. Вы можете передать partsOfNovel.keys на это вместе с закрытием для сортировки. – Lance

+0

Функция сортировки Swift - это простой способ сделать это, и вы можете найти объяснение в книге Swift от Apple. [Закрытие] (https://developer.apple.com/library/mac/documentation/swift/conceptual/swift_programming_language/Closures.html) –

ответ

5

Как насчет красивой функции Quicksort для заказа вашего массива строк? (Source)

Сначала создайте расширение массива для разложения заданного массива:

extension Array { 
    var decompose : (head: T, tail: [T])? { 
    return (count > 0) ? (self[0], Array(self[1..<count])) : nil 
    } 
} 

Вторых создать функцию Быстрой сортировки, так что вы можете заказать разложившийся массив:

func qsort(input: [String]) -> [String] { 
    if let (pivot, rest) = input.decompose { 
    let lesser = rest.filter { $0 < pivot } 
    let greater = rest.filter { $0 >= pivot } 
    return qsort(lesser) + [pivot] + qsort(greater) 
    } else { 
    return [] 
    } 
} 

Объявляет переменный с явным тип (словарь и массив):

var partsOfNovel = [​String​ : [String]]() 
var partsSectionTitles = [String]() 

Заполните их:

partsOfNovel = [ 
    "Part 1" : ["Chapter X:1", "Chapter X:2", "Chapter X:3"], 
    "Part 2" : ["Chapter X:1", "Chapter X:2"], 
    "Part 3" : ["Chapter X:1"] 
] 

partsSectionTitles = partsOfNovel.allKeys 
// ["Part 1", "Part 3", "Part 2"] 

И, наконец, заказать Струны массив:

var orderedSectionTitles = qsort(partsSectionTitles) 
// ["Part 1", "Part 2", "Part 3"] 

Я думаю, что это хорошее решение в чистом Swift, я надеюсь, что это помогает!

+1

'partsOfNovel' должен быть объявлен как тип' [String: [String]] ', а не типа' [String: String] '. –

+0

Да, вы можете сделать так, чтобы быть абсолютно уверенным, но в этом случае компилятор правильно сообщает, что вы отправляете массив строк. Но я согласен, что лучше. –

+0

Здравствуйте, Благодарим вас за ответ. Я использовал только часть, но она работала: вар partsOfNovel = [строка: [String]]() Я также изменил заявление partsOfNovel на: partsSectionTitles.sort() {$ 0 <$ 1} Спасибо еще раз! –

9

Это должно удовлетворить ваши потребности. Массив содержит элемент String.

var partsSectionTitles:[String] = partsOfNovel.allKeys as [String] 
var sortedNames = partsSectionTitles.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedDescending } 
+0

'var partsSectionTitles: [String] = partsOfNovel.allKeys as [String]' не компилируется для меня. Я получаю следующее сообщение об ошибке: '' [String: Array ] 'не имеет члена с именем' allKeys''. –

+0

Вы можете использовать 'NSDictionary (dictionary: partsOfNovel) .allKeys' для кастинга, код OP имеет' var partsOfNovel = [:] '. – gabbler

1

Допустим, у вас есть следующий код Objective-C с NSDictionary и NSArray:

NSDictionary *partsOfNovel = @{@"Part 1" : @[@"Chapter X:1", @"Chapter X:2", @"Chapter X:3"], 
           @"Part 4" : @[@"Chapter X:1", @"Chapter X:2"], 
           @"Part 3" : @[@"Chapter X:1"]}; 

NSArray *partsSectionTitles = [[partsOfNovel allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
NSLog(@"%@", partsSectionTitles); 

С помощью этого кода, консоль будет печатать:

"Part 1", 
"Part 3", 
"Part 4" 

С Swift, вы можете получить ключи от Dictionary и положите их в Array следующим образом:

let partsOfNovel = [ 
    "Part 1" : ["Chapter X:1", "Chapter X:2", "Chapter X:3"], 
    "Part 4" : ["Chapter X:1", "Chapter X:2"], 
    "Part 3" : ["Chapter X:1"]] 

let nonOrderedPartsSectionTitles = partsOfNovel.keys.array 

Вы можете применить сортировку этой Array и напечатать результат:

let partsSectionTitles = nonOrderedPartsSectionTitles.sorted { $0.localizedCaseInsensitiveCompare($1) == NSComparisonResult.OrderedAscending } 
println(partsSectionTitles) //[Part 1, Part 3, Part 4] 

Но все это может быть сделано с Swift в гораздо краткой форме (протестировано с Playground):

let partsOfNovel = [ 
    "Part 1" : ["Chapter X:1", "Chapter X:2", "Chapter X:3"], 
    "Part 4" : ["Chapter X:1", "Chapter X:2"], 
    "Part 3" : ["Chapter X:1"]] 

let partsSectionTitles = partsOfNovel.keys.array.sorted { $0.0 < $1.0 } 
println(partsSectionTitles) //[Part 1, Part 3, Part 4] 
+0

Здравствуйте, Благодарим вас за ответ. Я использовал только часть, но она работала: partsSectionTitles.sort() {$ 0 <$ 1} Я также изменил заявление partsOfNovel на: вар partsOfNovel = [строка: [String]]() Спасибо еще раз! –

4
let array = ["j","d","k","h","m"] 
func backward(x : String, y: String) -> Bool 
{ 
    return x>y 
} 

var reverse = sorted(array,backward) 


println((reverse)) 

или вы можете написать как:

var newrev = sorted(array, {$0 < $1}) 

или

var other = sorted (array , >) 
Смежные вопросы