【问题标题】:How to sort three arrays based on the order of two arrays. Swift如何根据两个数组的顺序对三个数组进行排序。迅速
【发布时间】:2016-07-14 10:57:19
【问题描述】:

我能想到的唯一方法是在第一次根据评分排序之后,我将所有具有相同评分的名称分组在一起,然后根据数量对该组进行排序。这有点复杂,我想我需要实现一个函数来做到这一点。有没有更短的方法来做到这一点?谢谢。

// **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. 

【问题讨论】:

    标签: arrays swift sorting methods


    【解决方案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 }
    

    【讨论】:

    • 您介意提供更多可以解决我提供的示例的代码吗?谢谢。
    • @PakHoCheung 只需创建一个[Entry] 类型的数组。如果你让Entry 结构符合Comparable 协议,你就可以很容易地对它们进行排序。
    • 好的。让我先看看 swift 库。之前没用过struct。
    • Comparable 可能不是这里的正确工具。这只是Entry 的一种合理排序顺序。这不是您想要对它们进行排序的唯一方法(Comparable 强制您选择一个且唯一的排序顺序)。相反,您使用带有isOrderedBefore 函数的sort 版本。
    • 如果评级、名称和数量的数组是从服务器追加的呢?我想我不能手动设置像 Entry(name: "a", rating: 4, quantity: 3) 这样的东西。基于这种情况,我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2022-01-28
    • 1970-01-01
    相关资源
    最近更新 更多