2017-02-08 22 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)]

相关问题