2014-11-08 19 views
6

Swift and Objective-C.Swift: Sıralamayı Alfabetik Sıraya göre Sırala

Ben bir sözlük ve bir dizi beyan eden bir tablo görünümü denetleyicisi var: Benim viewDidLoad fonksiyonunda

var parts = [:] 
var partsSectionTitles: NSArray! 

, ben: Zaten başarıyla tamamladık

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

var partsSectionTitles = parts.allKeys 

tablo görünümü amaç-C kontrol ve alfabetik partsSectionTitles sıralamak amacıyla, kullandığım:

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

Yani, sorum şu: Swift'deki önceki Objective-C kodunu nasıl yazarım? Cevaplarınız için şimdiden teşekkür ederim.

GÜNCELLEME: Sorunu, sağladığınız cevaplardan parçalar ve parçalar kullanarak çözebildim. Öyleyse teşekkür ederim! İşte ne var: Beni her anahtarına birden fazla değer sağlamak için izin

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

:

parçalarımda olarak sözlüğe ilan etti. Bu büyük bir yardım oldu. Ben hiç hata aldı gibi bu çalıştı

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

:

Sonra partsSectionTitles oluşturmak ve bunu sıralamak başardı.

+0

Denediğin şeyi yayınlamadığın için oy verdin. Eminim birkaç şey denediniz. Şimdiye kadar sahip olduğunuz şeyi gönderin ve düzeltmenize yardımcı olabiliriz :) – Lance

+1

Şans eseri bir şey denemediyseniz, Swifts global Sort işlevine göz atın. SortOfNovel.keys öğesini, sıralama yapmak için bir kapatma ile birlikte geçirebilirsiniz. – Lance

+0

Swift'in Sıralama işlevi, bunu yapmanın kolay bir yoludur ve Swift'in Kitabı'ndan Apple'dan bir açıklama bulabilirsiniz. [Closures] (https://developer.apple.com/library/mac/documentation/swift/conceptual/swift_programming_language/Closures.html) –

cevap

5

ne olacak?

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 [] 
    } 
} 

açık olan değişkenleri bildir: Eğer çürümüş Diziyi sipariş edebilirsiniz böylece

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

İkinci Quicksort işlevi oluşturun: (Source)

İlk verilen diziyi ayrıştırmak için bir dizi uzantısı oluşturmak (sözlük ve Array) yazın:

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

Ve nihayet Strings Array sipariş: 210 doldurmak onları

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

Ben saf Swift güzel bir çözüm olduğunu düşünüyorum, umarım yardımcı olur!

+1

'partsOfNovel',' [String: String] 'türünden değil,' [String: [String]] 'türünden bildirilmelidir. –

+0

Evet, bu şekilde tamamen emin olmanızı sağlayabilirsiniz, ancak bu durumda derleyici bir dizi strins gönderdiğinizi doğru şekilde belirler. Ama katılıyorum daha güzel. –

+0

Merhaba, Cevabınız için teşekkür ederiz. Sadece bir kısmını kullanılır, ama çalıştı: var partsOfNovel = [dizesi: [dize]]() Ayrıca için partsOfNovel bildirge değiştirildi: partsSectionTitles.sort() {$ 0 <$ 1} sayesinde tekrar! –

9

Bu sizin ihtiyacınızı karşılamalıdır. Dizi String öğesi içerir. Dize dizinizi sipariş için güzel Quicksort işlevi hakkında

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

'var partsSectionTitles: [String] = partsOfNovel.allKeys olarak [String]' benim için derleme yapmıyor. Aşağıdaki hata iletisini alıyorum: ''[String: Array ]' allKeys 'adlı bir üye yok. –

+0

Kullanabileceğiniz 'NSDictionary (dictionary: partsOfNovel) .allKeys' için döküm, OP kodu 'var partsOfNovel = [:]' vardır. – gabbler

1

Diyelim ki NSDictionary ve NSArray aşağıdaki Objective-C kodu var diyelim: Bu kod ile

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); 

, konsol yazdırır: Swift ile

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

, anahtarları alabilirsiniz bir Dictionary ve bunun gibi bir Array koydu:

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 

Daha sonra bu Array üzerinde bir tür uygulamak ve bunun gibi bir sonuç yazdırabilirsiniz:

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

Ama bunların hepsi çok özlü bir şekilde Swift ile yapılabilir (Oyun ile test):

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

Merhaba, Cevabınız için teşekkür ederiz. Sadece bir kısmını kullanılır, ama çalıştı: partsSectionTitles.sort() {$ 0 <$ 1} Ayrıca için partsOfNovel bildirge değiştirildi: var partsOfNovel = [dizesi: [dize]]() sayesinde tekrar! –

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)) 

veya benzeri yazabilirsiniz:

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

veya

var other = sorted (array , >) 
İlgili konular