arrays - 如何根据两个数组的顺序对三个数组进行排序。 swift

标签 arrays swift sorting methods

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

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

最佳答案

与其维护三个需要同步的数组,不如维护一个简单结构的数组。

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 }

关于arrays - 如何根据两个数组的顺序对三个数组进行排序。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241065/

相关文章:

javascript - 如何使用 Ramda remove 从对象数组中删除空对象?

ios - 使用未声明的类型 'AppDelegate' Swift

ios - swift 函数不返回字符串?

java - 如何在 Java 中创建锯齿状的二维数组?

python - 如何将 numpy.argpartition 的输出应用于二维数组?

java - 对两个平行数组进行排序

c++ - 对 STL::抽象数据类型列表进行排序

Javascript:根据具有类的子元素中的值对列表进行排序

javascript - 是否可以迭代数组中的每个项目并输出为 HTML?

ios - TableView 单元格启用编辑