Быстрая сортировка словаря по значению в виде массива - PullRequest
1 голос
/ 21 июня 2019

Привет, ребята, у меня есть struct Datas () , которая содержит поле start с датой.Мне нравится 24 объекта, и я хочу добавить его в коллекцию и отсортировать коллекцию по времени (поле .start ).Я пробовал ответы из стека, но это не мой случай.

var todaysTimes = [Int:[Datas]]()


struct Datas {

var id: Int
var isVisited: Bool
var start: Date
var end: Date
}

настройка ячейки

private func configureCell(collectionView: UICollectionView, indexPath: IndexPath) -> UICollectionViewCell {

    let availableSessionTimeCell = collectionView.dequeueReusableCell(withReuseIdentifier: availableSessionCell, for: indexPath) as! EVAvailableSessionTimeCell
    let dataItem = todaysTimes[clinicSection[indexPath.section]!]![indexPath.row]

   availableSessionTimeCell.dateLabel.text = Date.time(day: dataItem.start)

    return cell
}

Ответы [ 3 ]

2 голосов
/ 21 июня 2019

Как я понял, вы хотели бы отсортировать массив объектов Datas в своем словаре. Но не сортируйте dictionary сам. Если вы хотите отсортировать каждое value (что составляет [Datas]) в вашем словаре key-value, то в вашем viewDidLoad(), вероятно, вы можете отсортировать массив в ваших данных так, как вам нужно (либо ascending, либо descending).

Вы можете добиться этого, зацикливая свой словарь и сортируя значения таким образом:

for (id, datas) in todaysTimes {
        todaysTimes[id] = datas.sorted(by: { $0.start.compare($1.start) == .orderedDescending })
    }

Для полного примера , вы можете попробовать это в http://online.swiftplayground.run/:

struct Datas {
    var id: Int
    var isVisited: Bool
    var start: Date
    var end: Date
}

// Dump data to show an example
var todaysTimes = [Int:[Datas]]()
let today = Date()
let one_day_before_today = Calendar.current.date(byAdding: .day, value: -1, to: today)!
let two_day_before_today = Calendar.current.date(byAdding: .day, value: -2, to: today)!
todaysTimes[1] = [Datas(id: 1, isVisited: false, start: one_day_before_today, end: Date()), Datas(id: 1, isVisited: false, start: today, end: Date()), Datas(id: 1, isVisited: false, start: two_day_before_today, end: Date())]

// Sort Descending
print("Sorted descending")
for (id, datas) in todaysTimes {
    todaysTimes[id] = datas.sorted(by: { $0.start.compare($1.start) == .orderedDescending })
}
print(todaysTimes)

// Sort Ascending
print("Sorted ascending")
for (id, datas) in todaysTimes {
    todaysTimes[id] = datas.sorted(by: { $0.start.compare($1.start) == .orderedAscending })
}
print(todaysTimes)

// Will print these two lines
// Sorted descending
// [1: [SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-21 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-20 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-19 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000)]]
// Sorted ascending
// [1: [SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-19 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-20 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000), SwiftPlayground.Datas(id: 1, isVisited: false, start: 2019-06-21 12:13:34 +0000, end: 2019-06-21 12:13:34 +0000)]]
// Try the example in online.swiftplayground.run
1 голос
/ 21 июня 2019

Вам просто нужно использовать комбинацию forEach(_:) и sorted(_:), чтобы получить эту работу, т.е.

var todaysTimes = [Int:[Datas]]()
todaysTimes.forEach { (key,value) in
    let newValue = value.sorted(by: { $0.start < $1.start }) //will sort in ascending order
    todaysTimes[key] = newValue
}

В случае, если вы хотите отсортировать ее в в порядке убывания ,вы просто используете > вместо <, то есть

let newValue = value.sorted(by: { $0.start > $1.start })
1 голос
/ 21 июня 2019

Вы должны отсортировать массив перед вызовом configureCell. Поэтому в вашем методе viewDidLoad вы должны использовать что-то вроде этого.

dates.sort(by: {(p1: Datas, p2: Datas) -> Bool in
        return p1.start > p2.start
    })

После этого вы можете идти.

К сожалению, сортировать словарь сложнее.

Это обсуждается в этом вопросе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...