【问题标题】:Swift For loop Enumeration in Sort differs排序中的 Swift For 循环枚举不同
【发布时间】:2018-01-02 21:52:04
【问题描述】:

我正在尝试对以下数组进行手动排序。

这里的问题是,从“for-loop enumuration”(表示为 //(2))读取项目与将其作为下标读取(表示为 //(1))时,结果会有所不同。这可能是隐藏在我眼前的一个小问题。珍惜你的时间。

var mySortArray : Array<Int> = []

mySortArray = [1,5,3,3,21,11,2]

for (itemX,X) in mySortArray.enumerated() {

  for (itemY,Y) in  mySortArray.enumerated() {

       // if  mySortArray[itemX] <  mySortArray[itemY] // (1)
        if X < Y  // (2)
        {
            //Swap the position of item in the array
                mySortArray.swapAt(itemX, itemY)
        }

    }
}

print(mySortArray)

// Prints [1, 2, 3, 3, 5, 11, 21]  ( for condition // (1))
// Prints [2, 1, 3, 5, 11, 3, 21]  ( for condition // (2))

mySortArray = [1,5,3,3,21,11,2]
print("Actual Sort Order : \(mySortArray.sorted())")
// Prints Actual Sort Order : [1, 2, 3, 3, 5, 11, 21]

【问题讨论】:

  • 方法(2)不起作用,因为enumerated()创建的序列不反映枚举期间对数组所做的更改。

标签: arrays swift sorting enumerate


【解决方案1】:

这里的问题是函数.enumerated() 返回一个新序列并对其进行迭代。将其视为一个新数组。

所以,您在这里使用 3 个不同的数组。

您有一个要修复的未排序数组。让我们称它为w(“工作数组”),然后你有数组x 和数组y

所以,w[1,5,3,3,21,11,2]xy 在开头实际上与 w 相同。

现在您获得了需要交换的前两个值...

valueX 位于索引 1x (5)。 valueY 位于索引 2y (3)。

然后你把它们换成...w

所以现在w[1,3,5,3,21,11,2]xy 没有改变。

所以现在你的索引被抛弃了。您将x 中的项目与y 中的项目进行比较,然后在we 中交换它们,这是完全不同的。

您需要一直使用一个数组。

当然...还有一个问题是您的功能目前非常慢。 O(n^2),还有更高效的排序方式。

如果您将此作为学习如何编写排序算法的练习,那么请继续。如果不是,你真的应该使用.sort() 函数。

你真正想做的根本不是使用.enumerated()。只需使用ints 获取(和交换)w 中的值。

即像

for indexX in 0..<w.count {
    for indexY in indexX..<w.count {
        // do some comparison stuff.
        // do some swapping stuff.
    }
}

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2015-12-13
    相关资源
    最近更新 更多