【问题标题】:Sorting Arrays Swift快速排序数组
【发布时间】:2018-01-05 08:52:44
【问题描述】:

我有一个表示它们自己的字符串的整数数组。

我知道有一些简单的方法可以对整数数组进行排序,但我需要这样做,以便整数保留它们与字符串的对应关系。

这是我当前的代码:

var i = 0
var highestValueObjectInArray = 0
for object in createTimerData.speechTimeStamps {

    if object > highestValueObjectInArray {
        highestValueObjectInArray = object
    }

}

while i + 1 < createTimerData.speechTimeStamps.count {

    if createTimerData.speechTimeStamps[i] < createTimerData.speechTimeStamps[i + 1] {

        let TS2 = createTimerData.speechTimeStamps[i + 1]
        let TSS2 = createTimerData.speechText[i + 1]

        createTimerData.speechTimeStamps.remove(at: i + 1)
        createTimerData.speechTimeStamps.insert(TS2, at: i)
        createTimerData.speechText.remove(at: i + 1)
        createTimerData.speechText.insert(TSS2, at: i)

    }

    i += 1
    if i+1 >= createTimerData.speechTimeStamps.count {

        var lastItem = highestValueObjectInArray + 1
        var inDescendingOrder = true
        for object in createTimerData.speechTimeStamps {
            if object < lastItem {} else { inDescendingOrder = false }
            lastItem = object
        }
        if inDescendingOrder == false {
            i = 0
        }
    }
}

它非常慢且效率不高,因此在对大型数组进行排序时需要大量时间。有没有我忽略的方法,或者更有效的方法。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 使用一个数组和一个字典来做到这一点,甚至是一个元组数组
  • 你试图对一个数组进行排序是什么?你能再解释一下吗?
  • 一个整数数组,我希望字符串数组遵循相同的排序,这样整数和字符串仍然相互匹配
  • 您可以使用元组数组 (int,String) 来执行此操作,如果您需要,我可以提供一些示例
  • 这意味着改变我的代码的整个工作方式

标签: ios arrays swift sorting


【解决方案1】:

通常,当您想要将单独的数组并排排序时,您应该真正考虑将它们合并到一个自定义类型的单个数组中。例如,speechTextspeechTimestamps 可能合并为一个单一类型的数组,Speech

struct Speech { 
    let text: String
    let timestamp: Int
}

let speeches = [
    Speech(text: "Baz", timestamp: 2),
    Speech(text: "Bar", timestamp: 3),
    Speech(text: "Foo", timestamp: 1)
]

然后您可以根据需要对它们进行排序:

let result = speeches.sorted { $0.timestamp < $1.timestamp }

显然,根据需要修改类型和名称,但希望这能说明这个想法。考虑一个类型的单个数组,该数组捕获正在排序的两个事物。

【讨论】:

    【解决方案2】:

    您可以将两个数组压缩在一起,对压缩后的数组进行排序,然后将它们分开,如下所示

    let arr1 = [1,4,2,5,3]
    let arr2 = ["One","Four","Two","Five","Three"]
    
    let combined = zip(arr1, arr2).sorted(by: {
        $0.0 < $1.0
    })
    
    let sorted1 = combined.map {$0.0}
    let sorted2 = combined.map {$0.1}
    
    print(sorted1) // [1, 2, 3, 4, 5]
    print(sorted2) // ["One", "Two", "Three", "Four", "Five"]
    

    【讨论】:

    • 这太棒了,谢谢,但我希望它按降序排序 - 我该怎么做?
    • 没关系,做了:$1.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2020-12-20
    • 2020-11-12
    • 2021-06-15
    相关资源
    最近更新 更多