2016-03-26 20 views
1

私が考えることができる唯一の方法は、レーティングに基づいた最初のソートの後で、同じレーティングを持つすべての名前をグループ化し、数量に基づいてそのグループをソートします。それは少し複雑で、私はそれを行うための関数を実装する必要があると思います。それを行うより短い方法はありますか?ありがとう。2つの配列の順序に基づいて3つの配列をソートする方法。 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. 

答えて

4

同期を必要とする3つの配列を維持するのではなく、シンプルな構造体の配列を1つだけ維持してください。

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 
} 

これで、アルゴリズムは簡単になり、計算が少なくて済むようになります。

あなたはいくつかの点で別々の配列を必要とする場合(私はめったに実際にはこれが必要見つけるんが)、それはそれを解凍するのは簡単です:

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

あなたは私が提供した例を解決することができ、よりコードを提供するために、気にしませんか?ありがとう。 –

+0

@PakHoCheung '[Entry]'型の単一の配列を作るだけです。 'Entry'構造体が' Comparable'プロトコルに準拠するようにすれば、かなり簡単にそれらをソートすることができます。 –

+0

OK。早急にライブラリを見てみましょう。以前はstructを使用していませんでした。 –

関連する問題