2017-03-29 4 views
2

並べ替えのプロセスを視覚化できますか?Swiftの配列ソートの理解方法

let numbers = [0,2,1] 
let sortedNumbers = numbers.sorted { $0 > $1 } 

私は現実の生活の中で降順にこれらの3つの数字を並べ替えるとしたら、それはこのことになるに:scrSh1が、スウィフトは、それが複雑になり:scrSh2

どのように4回の返品があり、最後の1回が「偽」ですか? 引数$ 0と$ 1の位置はどのように変わりますか?

+1

これは、使用されているソートアルゴリズムに関するものです。 2つの要素$ 0と$ 1を比較します。結果に応じてあなたを移動させます。毎回$ 0と$ 1を表示するログを追加できるはずです。 – Larme

+0

@Larmeええ、私は各結果を印刷しようとしましたが、それは不可能だと思います。 – PigeonPO

+0

@PigeonPOここでは、さまざまな閉鎖構文糖すべてを分解する答えがあります:http://stackoverflow.com/a/40390414/3141234 – Alexander

答えて

3

遊び場でこのようなファイル名を指定して実行して、そしてあなたはそれがより詳細にどのように動作するか表示されます。

let numbers = [0,2,1] 
let sortedNumbers = numbers.sorted { 
    print("0: \($0), 1: \($1), returning \($0 > $1)") 

    return $0 > $1 
} 

$ 0が単に最初の引数で、$ 1が第二です。あなたの数字の配列があると、出力:

0: 2, 1: 0, returning true 
0: 1, 1: 0, returning true 
0: 1, 1: 2, returning false 
+0

ありがとう!それは私を助けるだろう。 – PigeonPO

1

それは構文簡素化され、それは同等です::実際$0

numbers.sorted {(a, b) -> Bool in 
     return a > b 
    } 

編集... $1が第二1で、閉鎖の最初のパラメータであります実際には4回呼び出されるという事実は、使用されたソートアルゴリズムのためです。そして、あなたはそれを世話するべきではありません。

+0

私はそれを編集しました、申し訳ありません。 – Zaphod

+0

次の行を追加すると良いでしょう: 'print(a、b、a> b)' – PigeonPO

0

sorted関数は、任意の2つの要素の順序を定義するクロージャを使用します。ソートアルゴリズムはアイテム間の一連の比較を行い、クロージャを使用してクロージャを使用してそれらの間の順序を決定します。

ここ番号の例配列の選別において行われたすべての比較を出力例は次のとおり

let numbers = [0, 9, 1, 8, 2, 7, 3, 6, 4, 5] 
let sorted = numbers.sorted { (a: Int, b: Int) -> Bool in 
    let result = a < b 
    print("\(a) is \(result ? "" : "not") before \(b)") 
    return result 
} 

print(sorted) 

$0$1暗黙閉鎖パラメータあります。それらは暗黙のうちにクロージャのパラメータに与えられた名前です。これらは、クロージャのパラメータに与えられた名前が、この場合のようにむしろ任意の場合によく使用されます。あなたはleftElementrightElementは、暗黙的に使用することが好ましいている理由である、コードに多くの情報を追加しない見ることができるように

let numbers = [0,2,1] 
let sortedNumbers = numbers.sorted { leftElement, rightElement in 
    return leftElement > rightElement 
} 

:それはそうのようなものだったかのように、あなたの例では

、閉鎖は動作しますこのような場合のクロージャパラメータ

0

ザ・「(4回)」({ $0 > $1 })あなたの閉鎖を意味はsorted機能によって4回呼び出さなっています。

falseの意味はわかりませんが、sorted(例:David Shawの方法で視覚化することができます)の内部ソートアルゴリズムに完全に依存しています。私。 $0および$1は、ではなく、 "位置を変更する"です。

1

それはまもなくなく、包括的documentationで説明しています:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"] 

...

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 }) 

速記引数名

スウィフトが自動的 クロージャをインライン化する速記引数名を提供し、これはクロージャのの値を参照するために使用できます引数を$0,$1,$2などのように指定します。あなたが閉鎖 式の中でこれらの速記引数名を使用する場合は

は、あなたがその 定義からクロージャの引数リストを省略することができ、そして速記引数名 の数と種類は、予想される関数の型から推測されます。ここで

reversedNames = names.sorted(by: { $0 > $1 }) 

$0$1クロージャの第一および第二のStringの引数を参照してください:閉鎖式は その本体のみで構成されているためinキーワードは も、省略することができます。

関連する問題