我需要以下内容:
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"]
答案 0 :(得分:1)
如果我理解正确,符合您条件的元素需要保持原来的位置,其他元素将在未修复的位置重新排序。
您可以做的是将可排序条目的原始索引映射到其值的已排序子集。然后使用该配对仅重新分配有资格使用各自(重新排序)值进行排序的数组元素。
例如:
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"]