对数组进行排序并保留目标C / swift中某些元素的原始顺序?

时间:2017-10-05 08:21:07

标签: objective-c arrays swift sorting

我需要以下内容:

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"]

1 个答案:

答案 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"]