【问题标题】:Sort array and leave the original order for some elements in objective C/swift?对数组进行排序并保留目标 C/swift 中某些元素的原始顺序?
【发布时间】:2017-10-05 08:21:07
【问题描述】:

我需要类似以下的东西:

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

【问题讨论】:

  • 您正在寻找«稳定排序»:stackoverflow.com/questions/40673374/…?
  • “每个数组对象可能按原始顺序或新顺序排序” 我不清楚。也许您可以添加一个清楚地说明您的问题的示例?
  • @MartinR @Larme 没有。那个问题是关于A nonstable sort may change the relative order of elements that compare equal. 加了一个例子
  • “如何存储原始订单”让我认为您想要一个“稳定排序”的问题要么不清楚和/或被我误解了。你的意思是像伪代码let except = ["a", "d", "f"] if (except.contains(obj1) &amp;&amp; !except.contains(obj2){ return true} else if (!except.contains(obj1) &amp;&amp; except.contains(obj2){ return false} else{ return obj1&lt; obj2 }?
  • 我看到了字母顺序排序,但是如果let arr = ["a", "f", "d", "b", "y", "c", "e"]resultArr == ["a", "f", "d", "b", "c", "e", "y"]resultArr == ["a", "d", "f", "b", "c", "e", "y"] 呢?如果是第一个,稳定排序应该是解决方案(除非有另一个特殊顺序),对于最后一个,只需阅读我之前评论中的伪代码即可。

标签: objective-c arrays swift sorting


【解决方案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"]

【讨论】:

  • 不错的解决方案。关键是库排序函数不能直接实现想要的顺序;因为任何两个元素的顺序取决于它们的相对位置,并且在排序过程中会发生变化,这反过来又破坏了库排序合同。您要么必须编写自定义排序,要么将原始数据分成固定和可移动的集合,使用后者的库排序,然后重新组合。您对拆分/重组方法的表述很好。
  • 还没有检查它是否正确,但你应该修正你的答案:1)不存在“afd”字符串 - 我使用字符串数组代替,每个字符串的长度可能> 0; 2)如果我修复字符串“ady”,它会起作用吗?
  • 条件只是一个例子。由于它是一个任意函数,它可以是任何函数,所以是的,这也适用于其他组合,例如“ady”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多