Swift For循环中的Enumeration不同

时间:2018-01-02 21:52:04

标签: arrays swift sorting enumerate

我试图在下面的数组上手动排序。

这里的问题是,从“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]

1 个答案:

答案 0 :(得分:1)

这里的问题是函数.enumerated()返回一个新序列并迭代它。把它想象成一个新阵列。

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

您有一个要解决的未排序数组。让我们称之为w(&#34;工作数组&#34;)然后你有数组x和数组y

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

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

valueX位于1(5)的索引xvalueY位于2(3)的索引y

你在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.
    }
}