1
votes

Tri rapide du dictionnaire par valeur sous forme de tableau

Bonjour les gars, j'ai struct Datas () qui contient le champ start avec la date. J'ai 24 objets et je souhaite les ajouter à la collection et trier la collection par heure (champ .start ). J'ai essayé les réponses de la pile, mais ce n'est pas mon cas.

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
}

configurer la cellule

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


struct Datas {

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


3 Réponses :



2
votes

Comme je l'ai compris, vous souhaitez trier le tableau des données d'objets dans votre dictionnaire. Mais ne triez pas le dictionnaire lui-même. Si vous souhaitez trier chaque valeur (qui est [Datas] ) dans votre dictionnaire valeur-clé puis dans votre viewDidLoad () vous pourriez probablement trier le tableau de vos données pour qu'il soit comme vous le souhaitez (soit croissant ou décroissant ).

Vous pouvez y parvenir en effectuant une boucle dans votre dictionnaire et en triant les valeurs de la manière suivante:

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

Pour un exemple complet, vous peut essayer ceci dans http://online.swiftplayground.run/ :

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


0 commentaires

1
votes

Vous devez simplement utiliser une combinaison de forEach (_ :) et sorted (_ :) pour que cela fonctionne, c'est-à-dire

let newValue = value.sorted(by: { $0.start > $1.start })

Si vous souhaitez le trier par ordre décroissant , utilisez simplement > au lieu de , c'est-à-dire

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
}


0 commentaires