我需要如下内容:
let arr = [...] //array of strings
let resultArr = arr.sort({obj1,obj2 in
if some_condition(obj1, obj2) {
...//return the order of obj1 and obj2 from arr
} else {
return obj1 < obj2
}
})
我看到很多关于如何对数组项进行简单排序的问题/答案,但没有人回答如何存储原始顺序。 some_condition
可以是任意的,但每个数组对象可以按原始顺序或新顺序排序。如何解决这个问题?
示例
let arr = ["a", "f", "d", "b", "y", "c", "e"]
//elements "a", "d", "f" conform some_condition
resultArr == ["a", "f", "d", "b", "c", "e", "y"]
最佳答案
如果我没理解错的话,满足你条件的元素需要准确的留在原来的位置,其他元素会在不固定的位置重新排序。
您可以做的是将可排序条目的原始索引映射到其值的已排序子集。然后使用该配对仅重新分配数组中有资格使用其各自(重新排序的)值进行排序的元素。
例如:
var arr = ["a", "f", "d", "b", "y", "c", "e"]
let isFixed:(String)->Bool = { ["a","f","d"].contains($0) } // condition for fixed elements
zip(arr.enumerated().filter{!isFixed($1)},arr.filter{!isFixed($0)}.sorted())
.forEach{ arr[$0.0] = $1 }
print(arr) // ["a", "f", "d", "b", "c", "e", "y"]
关于objective-c - 对数组进行排序并保留 Objective-C/swift 中某些元素的原始顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580970/