Сортировать массив, исключая элементы - PullRequest
0 голосов
/ 28 июня 2018

У меня есть массив элементов пользовательского типа, которые я отображаю в виде таблицы. Каждый элемент имеет свойства и особенно «уровень» (0, 1, 2 или 3 как Int)

Что я хочу сделать:
Я хочу отсортировать эти элементы по их уровню, но отображая только элементы уровня 3 в верхней части таблицы и игнорируя другие элементы уровня <3. </p>

Что я пробовал :
- self.elements.sort(by: { $0.level! > $1.level! })
=> Все события отсортированы

- if element.level! > 2 { self.elements.sort(by: { $0.level! > $1.level! }) }
=> Не работает



Я действительно не знаю, что делать ... есть идеи?
Спасибо!

EDIT
Извините, возможно, я не совсем ясно:
У меня есть массив элементов, которые я сначала сортирую по расстоянию до пользователя, а затем хочу, чтобы только элементы уровня 3 находились в верхней части таблицы. И в идеале я хотел бы, чтобы эти элементы уровня 3 также сортировались по расстоянию.
-> Вывод, который я хочу: элементы отсортированы по расстоянию, с элементами уровня 3 вверху, и я также хочу, чтобы эти элементы уровня 3 были отсортированы по расстоянию

(Простите, английский не мой родной язык)

Ответы [ 5 ]

0 голосов
/ 28 июня 2018

Предполагая, что у нас есть следующая структура ...

struct SomeStruct: CustomStringConvertible {
    var level: Int
    // create a random distance for demonstration
    let distance = Double(arc4random_uniform(100))

    var description: String {
        return "Level: \(level), Distance: \(distance)"
    }
}

И массив этих структур ...

var arrayOfStructs = [
    SomeStruct(level: 3),
    SomeStruct(level: 1),
    SomeStruct(level: 1),
    SomeStruct(level: 2),
    SomeStruct(level: 1),
    SomeStruct(level: 3),
    SomeStruct(level: 3),
    SomeStruct(level: 2),
]

Вы можете отсортировать этот массив с вашими критериями, как это:

arrayOfStructs.sort {
   ($0.level == 3 || $1.level == 3 && $0.level != $1.level) ? ($0.level == 3) : ($0.distance < $1.distance)
}

Тогда arrayOfStructs.forEach { print($0) } приводит к следующему:

Level: 3, Distance: 38.0
Level: 3, Distance: 60.0
Level: 3, Distance: 75.0
Level: 1, Distance: 15.0
Level: 2, Distance: 23.0
Level: 2, Distance: 52.0
Level: 1, Distance: 65.0
Level: 1, Distance: 78.0
0 голосов
/ 28 июня 2018

Мне удалось сделать это, добавив элементы уровня 3 в другой массив. Затем я сортирую оба массива по расстоянию и, наконец, объединяю их для отображения элементов в табличном представлении.

Спасибо за помощь, ребята!

0 голосов
/ 28 июня 2018

Когда вам приходится иметь дело с такого рода действиями, которые могут быть периодическими и очень конкретными, я призываю вас создавать расширения, которые можно использовать повторно.

Есть пример:

Ваш CustomClass (только для примера)

class CustomClass {
    var text: String!
    var level: Int!

    convenience init(text: String, level: Int) {
        self.init()

        self.text = text
        self.level = level
    }
}

Модель с одним методом расширения (можно использовать снова и изменять)

extension Array where Element:CustomClass {
    mutating func sortWithFilter(minLevel: Int) {
        let list = self.sorted(by: { $0.level > $1.level})

        self = list.filter( { $0.level > minLevel })
    }
}

Использование:

// Create array with your CustomClass

var array = [CustomClass]()

// Add some data

array.append(CustomClass(text: "info1", level: 1))
array.append(CustomClass(text: "info2", level: 3))
array.append(CustomClass(text: "info3", level: 2))
array.append(CustomClass(text: "info4", level: 3))
array.append(CustomClass(text: "info5", level: 0))

// Use our new extension method

array.sortWithFilter(minLevel: 2)

Выход:

text : info2 , level : 3 
text : info4 , level : 3

Надеюсь, это поможет:)

0 голосов
/ 28 июня 2018

По вашему вопросу вам нужно показывать только объекты уровня 3, тогда не нужно их сортировать, просто отфильтруйте их, как показано ниже, и все готово. потому что вы показываете только 3 уровня пустым, другой объект будет игнорировать

elements.filter({$0.level == 3})
0 голосов
/ 28 июня 2018

Попробуйте это

self.elements.sort(by: { $0.level! > $1.level! }) 

var newArr = self.elements.filter({$0.level > 2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...