【问题标题】:Why is my implementation of array.sorted( by: ) in Swift returning a strange order?为什么我在 Swift 中的 array.sorted(by:) 实现返回一个奇怪的顺序?
【发布时间】:2016-12-07 17:11:42
【问题描述】:

我有一个自定义类:

class MyClass: MySuperClass
{
    var myNumber: Int

    required init ( id: Int, myNumber: Int )
    {
        self.myNumber = myNumber
        super.init( id: id )
    }

    required init ( id: Int )
    { 
        fatalError( "init() has not been implemented" ) 
    }
}

我创建了一个长度为 20 的对象的数组:

var myNumbers: [ MyClass ] = []

我遍历数组,打印出 myNumber 的值:

0
1
1221
0
0
18394
0
0
0
0
0
1222
6
0
110
0
0
24
71
2

然后我对它们进行排序:

myNumbers.sorted( by: { $0.myNumber < $1.myNumber } )

我再次遍历数组,打印出 myNumber 的值:

0
0
0
0
0
0
0
0
0
0
0
2
1
6
24
71
110
1222
1221
18394

如您所见,有点对它们进行了排序,但不是很令人满意。

请问我做错了什么?提前谢谢你。

【问题讨论】:

  • 一个独立的可重现的例子会很有帮助。 – 注意sorted( by:) 返回一个新的排序数组。 sort( by:) 对数组本身进行排序。
  • "'sort' 已重命名为 'sorted(by:)'"
  • 我的评论适用于 Swift 3/Xcode 8。——你使用的是哪个版本?
  • 我不明白的是:如果您使用“错误”的排序方法,那么原始数组根本不会被修改,而不是“几乎排序”。这就是为什么我要求一个可重现的例子。
  • 一个最小的 Swift 3 示例:var x = [3, 2, 1] ; x.sort(by: { $0 &lt; $1 } ) ; print(x) - 你真的应该提供一个minimal reproducible example,否则我们只能猜测。

标签: ios arrays swift sorting


【解决方案1】:

你想要.sortInPlace我相信..

myNumbers.sortInPlace( by: { $0.myNumber &lt; $1.myNumber } )

/// Sort `self` in-place according to `isOrderedBefore`.
///
/// The sorting algorithm is not stable (can change the relative order of
/// elements for which `isOrderedBefore` does not establish an order).
///
/// - Requires: `isOrderedBefore` is a
///   [strict weak ordering](http://en.wikipedia.org/wiki/Strict_weak_order#Strict_weak_orderings)
///   over the elements in `self`.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2023-04-02
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多