2017-02-08 6 views
2

私はまず施設を閉鎖してから距離を置いて配列を並べ替えたいと思います。たとえば、すべての閉店はダイナミックテーブルの一番下にある必要があり、その後、最短距離の残りのものを上部でソートする必要があります。今、私は次のコードを持っている:文字列の等号で並べ替え、次にSwiftで番号で並べ替えます。

bars.sort{ (lhs: barStruct, rhs: barStruct) -> Bool in 

    if lhs.tonight == "Closed" && rhs.tonight != "Closed"{ 
     return false 
    } 
    else { 
     return lhs.distance < rhs.distance 
    } 

を今、これが唯一のそれは時間のいくつかの

+2

それはあなたが投稿する必要があります –

+1

大文字で始まるあなたの構造体に名前を付けるスウィフト慣例がありますあなたの構造宣言とあなたの望む結果 –

答えて

1

はすべてクローズ&オープンの組み合わせ、ちょうどlhsが閉じていないとrhsオープンを考慮する必要がありません。私はあなたがされた後にある注文と思う:

bars.sort { (lhs : barStruct, rhs : barStruct) -> Bool in 
    if lhs.tonight == "Closed" 
    { 
     return false // Closed/Open & Closed/Closed 
    } 
    else if rhs.tonight == "Closed" 
    { 
     return true; // Open/Closed 
    } 
    else 
    { 
     return lhs.distance < rhs.distance // Open/Open => use distance 
    } 
} 

しかし、これは同様の距離によってそれらを注文する方がよいかもしれませんが、どのような方法でクローズバーを注文しません:

bars.sort { (lhs : barStruct, rhs : barStruct) -> Bool in 
    if lhs.tonight == "Closed" 
    { 
     if rhs.tonight == "Closed" 
     { 
     return lhs.distance < rhs.distance // Closed/Closed => use distance 
     } 
     else 
     { 
     return false // Closed/Open 
     } 
    } 
    else if rhs.tonight == "Closed" 
    { 
     return true; // Open/Closed 
    } 
    else 
    { 
     return lhs.distance < rhs.distance // Open/Open => use distance 
    } 
} 

今ならば閉じた/開くのための文字列ではなく、ブール値のフラグを持っていました。あなたはxor条件でそれを単一のifに減らすことができました...それは練習問題として残されています!

HTH

0

あなたは[barStruct(今夜: "オープン"、距離:9)2つのソート条件

struct barStruct{ 
    var tonight : String 
    var distance : Int 
} 

var bars = [barStruct(tonight: "Closed", distance: 12), 
      barStruct(tonight: "Closed", distance: 20), 
      barStruct(tonight: "Closed", distance: 1), 
      barStruct(tonight: "Closed", distance: 32), 
      barStruct(tonight: "Open", distance: 11), 
      barStruct(tonight: "Open", distance: 9), 
      barStruct(tonight: "Open", distance: 23), 
      barStruct(tonight: "Open", distance: 56),] 

bars.sort { (lhs: barStruct, rhs: barStruct) -> Bool in 
    if lhs.tonight == "Closed"{ 
     if rhs.tonight == "Closed"{ 
      //both on bottom level, addtionaly sort by distance 
      return lhs.distance < rhs.distance 
     }else{ 
      //left on bottom level, right on top level 
      return false 
     } 
    }else{ 
     if rhs.tonight == "Closed"{ 
      //left on top level, right on bottom level 
      return true 
     }else{ 
      //both on top level, addtionaly sort by distance 
      return lhs.distance < rhs.distance 
     } 
    } 
} 

print(bars) 

.tonight.distanceを分割する必要があり、barStruct(今夜: "オープン"、 barStruct(tonight: "open"、distance:23)、barStruct(tonight: "Open"、distance:56)、barStruct(tonight: "Closed"、distance:1)、barStruct "、距離:12)、barStruct(今夜:"閉鎖 "、距離:20)、barStruct(今夜:"閉鎖 "、距離:32)]

0

あなたの条件を最小にして、2つのキーのためにtonightdistanceとする必要があります。

1)ソート昇順としてtonightとしてください。..昇順として

2)入れた状態またはdistance

例:

struct testStruct { 
    var tonight : String 
    var distance : Int 
} 

var list = [testStruct(tonight: "Closed", distance: 1), 
      testStruct(tonight: "Closed", distance: 78), 
      testStruct(tonight: "Closed", distance: 14), 
      testStruct(tonight: "Closed", distance: 36), 
      testStruct(tonight: "Open", distance: 34), 
      testStruct(tonight: "Open", distance: 94), 
      testStruct(tonight: "Closed", distance: 3), 
      testStruct(tonight: "Open", distance: 56),] 

// sort condition 
let sortedList = list.sorted { (lhs, rhs) -> Bool in 
    if lhs.tonight == rhs.tonight { // If tonight is same then step 2 
     return lhs.distance < rhs.distance 
    } 
    // Follow step 1 
    return (lhs.tonight) > (rhs.tonight) 
} 

print(sortedList) 

出力:

[testStruct (今夜: "オープン"、距離:34)、testStruct(今夜: "オープン"、距離:56)、テスtestStruct(tonight: "Closed"、distance:1)、testStruct(tonight: "Closed"、distance:3)、testStruct(tonight: "Closed"、distance:14) )、testStruct(今夜: "クローズ"、距離:36)、testStruct(今夜: "クローズ"、距離:78)]

関連する問題