Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何根据两个数组的顺序对三个数组进行排序。敏捷的_Arrays_Swift_Sorting_Methods - Fatal编程技术网

Arrays 如何根据两个数组的顺序对三个数组进行排序。敏捷的

Arrays 如何根据两个数组的顺序对三个数组进行排序。敏捷的,arrays,swift,sorting,methods,Arrays,Swift,Sorting,Methods,我能想到的唯一方法是,在第一次基于评级排序之后,我将所有具有相同评级的名称分组在一起,并根据数量对该组进行排序。这有点复杂,我想我需要实现一个函数来实现它。有没有更短的方法?谢谢 // **Expected result** // sortedNameArray = ["b", "e", "a", "f", "c", "g", "d", "h"] // sortedRatingArray = [ 5, 5, 4, 3, 3, 3, 2, 2 ] // so

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

// **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
}
这样,您的算法应该变得微不足道,并且需要更少的计算

如果您在某个时候需要单独的数组,那么解压它是很简单的(尽管在实践中我很少发现这是必要的):


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

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
}
这样,您的算法应该变得微不足道,并且需要更少的计算

如果您在某个时候需要单独的数组,那么解压它是很简单的(尽管在实践中我很少发现这是必要的):


您是否介意提供更多可以解决我提供的示例的代码?谢谢。@PakHoCheung只需创建一个类型为
[Entry]
的数组。如果让
条目
结构符合
可比
协议,则可以非常轻松地对它们进行排序。好的。让我先看看swift图书馆。以前没有使用过struct。
Comparable
可能不是这里的正确工具。这只是
条目
的一个合理排序顺序。这不是对它们进行排序的唯一方法(
Comparable
强制您选择一个且仅选择一个排序顺序)。相反,您使用的是
sort
版本,该版本采用
isOrderedBefore
函数。如果评级、名称和数量的数组是从服务器追加的呢?我想我无法手动设置条目(名称:“a”,等级:4,数量:3)。基于这种情况,我应该怎么做?您是否介意提供更多代码来解决我提供的示例?谢谢。@PakHoCheung只需创建一个类型为
[Entry]
的数组。如果让
条目
结构符合
可比
协议,则可以非常轻松地对它们进行排序。好的。让我先看看swift图书馆。以前没有使用过struct。
Comparable
可能不是这里的正确工具。这只是
条目
的一个合理排序顺序。这不是对它们进行排序的唯一方法(
Comparable
强制您选择一个且仅选择一个排序顺序)。相反,您使用的是
sort
版本,该版本采用
isOrderedBefore
函数。如果评级、名称和数量的数组是从服务器追加的呢?我想我无法手动设置条目(名称:“a”,等级:4,数量:3)。基于这个案例,我应该怎么做?