2017-02-08 20 views
2

我想先排序我的數組是否關閉,然後再按距離排序。例如,所有「已關閉」的機構應該位於動態表格的底部,然後應該排列頂部距離最近的剩餘機構。現在,我有以下代碼:按字符串相等性排序,然後按照Swift 3中的數字排序

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" 
    { 
     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 
    } 
} 

現在:

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 
    } 
} 

然而,這並不下令以任何方式實心條,它可能是更好的訂購那些距離以及有一個布爾標誌,而不是一個字符串,對於閉合/開放,你可以減少到一個單一的,如果有異或條件...這是作爲一個練習!

HTH

0

你要分.tonight.distance成兩種類型條件

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) 

[barStruct(今晚: 「打開」,距離:9),barStruct(今晚: 「打開」, barStruct(今晚:「打開」,距離:23),barStruct(今晚:「打開」,距離:56),barStruct(今晚:「關閉」,距離:1),barStruct(今晚:「關閉「,距離:12),barStruct(今晚:」關閉「,距離:20),barStruct(今晚:」關閉「,距離:32)]

0

你必須使你的條件最小化和兩個鍵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),tes測試結構(今晚:「關閉」,距離:1),測試結構(今晚:「關閉」,距離:3),測試結構(今晚:「關閉」,距離:14 ),testStruct(今晚: 「關閉」,距離:36),testStruct(今晚: 「關閉」,距離:78)]

相關問題