2016-03-26 18 views
0

これは、下から上へのソートです。ループを繰り返している間は、配列内の最小の数で置換され、これが最後まで続きます。未解決の識別子 - inループロジック

ご覧のとおり、私はストライドを使用するようにリファクタリングしています。残念ながらvar lowest = firstIndexは私にいくつかの問題を与えています。

私はこの機能をストライドの右手で行うことができるはずですか? stride: throughの代わりにstride: toを使用する必要があります。そのチップのTimに感謝します。私はそれがこのように動作するようになった

func selOrganize(myList: Array<Int>) -> Array<Int> { 1 

    var extract = myList 

    for firstIndex in 0..<extract.count { 

     var lowest = firstIndex 

     for var secondIndex = firstIndex + 1; secondIndex < extract.count; secondIndex++ { 

      if extract[lowest] > extract[secondIndex] { 
       lowest = secondIndex 
    } 
     } 

     if firstIndex != lowest { 
      swap(&extract[firstIndex], &extract[lowest]) 
     } 
    } 
    return extract 
} 

更新構文

func selOrganize(myList: Array<Int>) -> Array<Int> { 

var extract = myList 

    // var lowest = firstIndex 

    // Do I need 'key'? Should I declare 'lowest' as a variable here? 
    // If I do use it here I get a "'lowest' is unmutable because it's a let" error 
    for (firstIndex, key) in extract.enumerate() { 

     // < > stride uses 'to' and <= >= stride uses through 
     for secondIndex in (firstIndex).stride(to: 0, by: +1) { 

      if extract[lowest] > extract[secondIndex] { 
       lowest = secondIndex 
      } 
     } 

    if firstIndex != lowest { 
     swap(&extract[firstIndex], &extract[lowest]) 
    } 

} 

return extract 
} 
+0

'a.strideで同じことを行うことができます(へ:B、によって:1)' '.. BallpointBen

答えて

1

func selOrganize(myList: Array<Int>) -> Array<Int> { 

    var extract = myList 

    // Accessing indices is simpler than calling enumerate, and 
    // the function only needs access to the indices, not the 
    // values of the enumeration: 
    for firstIndex in extract.indices { 

     // lowest needs to be defined inside this loop if you 
     // are going to initialize it using firstIndex 
     // because firstIndex isn't defined outside the loop. 
     var lowest = firstIndex 

     // You need to stride from the firstIndex to the end of the 
     // array, so the call to stride should look like this: 
     for secondIndex in firstIndex.stride(to: extract.count, by: 1) { 

      if extract[lowest] > extract[secondIndex] { 
       lowest = secondIndex 
      } 
     } 

     if firstIndex != lowest { 
      swap(&extract[firstIndex], &extract[lowest]) 
     } 
    } 

    return extract 
} 
+0

ありがとうございます。それは動作するようです。私は遊び場に数字を入れました。 (2番目のインデックスが抽出されている)と\(抽出された[secondIndex])) ")ですが、xcodeは' '未解決の識別子 'secondIndex'の使用を示しています。そこ? – TokyoToo

+0

'secondIndex'は' for-in'ループ内でのみ定義されます。あなたはそのループの外でプリントを呼び出していましたか?おそらく –

+0

。それは今働く。私は本当にもっと勉強する必要があります。私は非常に密集しているように感じます。多分私はちょうど疲れているでしょう。本当にありがとう。私は私の任務を終えることに近いです。 Btw、始まり..私は 'stride'と' standard'を使うべきかどうか、どうすればわかるのですか? TokyoToo

1

Strideが必要とされていない、あなたは標準for i in start..<end構文

func selOrganize(myList: Array<Int>) -> Array<Int> { 

    var extract = myList 

    for firstIndex in 0..<extract.count { 
    var lowest = firstIndex 
    for secondIndex in (firstIndex + 1)..<extract.count { 
     if extract[lowest] > extract[secondIndex] { 
     lowest = secondIndex 
     } 
    } 

    if firstIndex != lowest { 
     swap(&extract[firstIndex], &extract[lowest]) 
    } 
    } 
    return extract 
} 
であることを行うことができます

しかし、実際には1行

let sortedList = myList.sort{$0 < $1} 
+0

ありがとうございます。私はあなたの答えを私のメモにコピーしました。なぜなら、それは実際にはもっと「オーソドックスな」バージョンなのでです。私はこれまで使ってきたことを反映しているので、Romanの答えを正しいとマークしました。私はプロジェクトであまりにも頻繁にストライドを使用したと思いますので、できる限り私はあなたのものを使用します。残念ながら、私はストライドを使用すべきで、使用すべきではないとは思っていません。 – TokyoToo

+0

ストライドごとに2つ以上のインデックスをインクリメントするときに 'stride'が最も役に立ちます。 1つのインデックスをインクリメントしているだけの場合は、for-inループを使うことと変わりありません。 –

関連する問題