2017-02-08 9 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

это Swift конвенции назвать свои структур, начиная с прописной буквы –

+1

Вы должны опубликовать ваше объявление структуры вместе с вашими желаемыми результатами –

ответ

1

Вы должны рассмотреть все возможные комбинации Закрытого & Open, а не только lhs Закрытые и rhs Open. Я думаю, что заказ вы после:

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

Теперь, если вы имел булевский флаг, а не строку, для Closed/Open вы могли бы уменьшить это до одного, если с условием xor ... Это остается как упражнение!

НТН

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 (сегодня: "Open", расстояние: 9), barStruct (сегодня: "Open", Расстояние: 11), barStruct (сегодня вечером: «Открыть», расстояние 23), barStruct (сегодня: «Открыть», расстояние 56), barStruct (сегодня: «Закрыто», расстояние: 1), barStruct (сегодня: «Закрыто» «, расстояние: 12), barStruct (сегодня:« Закрыто », расстояние 20), barStruct (сегодня вечером:« Закрыто », расстояние: 32)]

0

Необходимо сделать свое условие минимальным и для двух клавиш tonight и distance.

1) Марка сортировки tonight как возрастающем порядке и ..

2) Поставить условие или distance в восходящем

Ex:

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 tStruct (сегодня: «Открыто», расстояние: 94), testStruct (сегодня: «Закрыто», расстояние: 1), testStruct (сегодня: «Закрыто», расстояние: 3), testStruct (сегодня: «Закрыто», расстояние: 14), testStruct (сегодня: "Закрыто", расстояние: 36), testStruct (сегодня: "Закрыто", расстояние: 78)]

 Смежные вопросы

  • Нет связанных вопросов^_^