2016-03-26 27 views
1

Düşünebilmemin tek yolu, derecelendirmeye dayalı ilk sıralamadan sonra, aynı reytinge sahip olan tüm adları gruplandırıyorum ve o gruba miktar bazında sıralama yapıyorum. Biraz karmaşık ve sanırım bunu yapmak için bir işlev uygulamak zorundayım. Bunu yapmanın daha kısa bir yolu var mı? Teşekkürler.İki dizinin sırasına göre üç dizi nasıl sıralanır. Swift

// **Expected result** 
//  sortedNameArray = ["b", "e", "a", "f", "c", "g", "d", "h"] 
// sortedRatingArray = [ 5, 5, 4, 3, 3, 3, 2, 2 ] 
// sortedQuantityArray = [ 4, 3, 3, 5, 3, 2, 4, 3 ] 


let nameArray  = ["a", "b", "c", "d", "e", "f", "g", "h"] 
let ratingArray = [ 4, 5, 3, 2, 5, 3, 3, 2] 
let quantityArray = [ 3, 4, 3, 4, 3, 5, 2, 3] 

let firstNameArray = Array(zip(nameArray, ratingArray)).sort { $0.1 > $1.1 }.map { $0.0 } 
let firstRatingArray = Array(zip(ratingArray, ratingArray)).sort { $0.1 > $1.1 }.map { $0.0 } 
let firstQuantityArray = Array(zip(quantityArray, ratingArray)).sort { $0.1 > $1.1 }.map { $0.0 } 

// first sorting based on rating 
firstNameArray  // = ["b", "e", "a", "c", "f", "g", "d", "h"] 
firstRatingArray // = [5, 5, 4, 3, 3, 3, 2, 2] 
firstQuantityArray // = [4, 3, 3, 3, 5, 2, 4, 3] 

// second sorting based on quantity. 

cevap

4

Senkronizasyon gerektiren üç diziyi korumak yerine, yalnızca basit bir yapının tek bir dizisini muhafaza edin.

struct Entry { 
    let name: String 
    let rating: Int 
    let quantity: Int 
} 

let entries = [ Entry(name: "a", rating: 4, quantity: 3), 
       Entry(name: "b", rating: 5, quantity: 4), 
       Entry(name: "c", rating: 3, quantity: 3), 
       Entry(name: "d", rating: 2, quantity: 4), 
       Entry(name: "e", rating: 5, quantity: 3), 
       Entry(name: "f", rating: 3, quantity: 5), 
       Entry(name: "g", rating: 3, quantity: 2), 
       Entry(name: "h", rating: 2, quantity: 3), 
] 

let sortedEntries = entries.sort { lhs, rhs in 
    if lhs.rating != rhs.rating { 
     return lhs.rating > rhs.rating 
    } 

    return lhs.quantity > rhs.quantity 
} 

Bununla, algoritmalarınız önemsiz hale gelmeli ve daha az hesaplama gerektirir.

bir noktada ayrı diziler gerektiriyorsa (nadiren pratikte bu gerekli bulmak rağmen), onu halletmek Önemsiz:

let nameArray = entries.map { $0.name } 
+0

sana verilen örnek çözebilir fazla koda sağlamak için sorun olur mu? Teşekkürler. –

+0

@PakHoCheung Sadece bir çeşit ['Giriş]' türünü yapın. "Giriş" yapısının "Karşılaştırılabilir" protokolüne uygun olmasına izin verirseniz, bunları kolayca kolayca sıralayabilirsiniz. –

+0

Tamam. Önce hızlı kütüphaneye bir göz atalım. Daha önce yapı kullanmamıştım. –

İlgili konular