2017-05-25 2 views
1

J'ai le dictionnaire suivant comme ceci:tri Dictionnaire sur deux valeurs rapides

["FLBEY023": ["Position": 8, "Page": 1], 
"COSMAX826": ["Position": 6, "Page": 2], 
"TOVIC029": ["Position": 7, "Page": 1], 
"CGLYN188": ["Position": 2, "Page": 2], 
"TOORL002B": ["Position": 1, "Page": 2], 
"GSTOGFU096": ["Position": 6, "Page": 1], 
"COSNAI423": ["Position": 2, "Page": 1], 
"COSCOL681": ["Position": 3, "Page": 2], 
"TONIV170": ["Position": 4, "Page": 1], 
"SUMAL086A": ["Position": 7, "Page": 2], 
"PEIAM004": ["Position": 5, "Page": 1], 
"FOSCI012": ["Position": 1, "Page": 1], 
"FOSWI009": ["Position": 4, "Page": 2], 
"GSTODOV061": ["Position": 3, "Page": 1]] 

Maintenant, j'aimerais trier ce dictionnaire pour chacun des codes de produit. Mais je voudrais le trier sur la position et la page. Ainsi, par exemple, je voudrais qu'il exécuter position, puis le numéro de page par exemple

["FOSCI012": ["Position": 1, "Page": 1], 
"COSNAI423": ["Position": 2, "Page": 1], 
"GSTODOV061": ["Position": 3, "Page": 1], 
.... 
... 
... 
"TOORL002B": ["Position": 1, "Page": 2], 
"CGLYN188": ["Position": 2, "Page": 2], 
.. 

Comment puis-je faire de manière en utilisant la méthode Dictionary.sorted. Je comprends comment faire pour trier en fonction d'un élément mais pas de deux.

+0

Le dictionnaire ne possède aucune commande. –

+0

Étant donné que vos dictionnaires internes ont des clés statiques, ils devraient être des instances d'un 'struct' donné à la place. – Hamish

Répondre

3

dictionnaires sont des collections non triées et vous ne pouvez pas les trier.

Cependant, vous pouvez utiliser la méthode .sorted(by:) qui retourne une liste de tuples ordonnés où chacun représente une entrée de valeur de clé dans le dictionnaire:

dictionary.sorted { (lhs, rhs) -> Bool in 

    if (lhs.value["Page"]! == rhs.value["Page"]!) { 
    return lhs.value["Position"]! < rhs.value["Position"]! 
    } else { 
    return lhs.value["Page"]! < rhs.value["Page"]! 
    } 
} 

qui se traduit par STH comme ci-dessous:

[(key: "FOSCI012", value: ["Position": 1, "Page": 1]), 
(key: "COSNAI423", value: ["Position": 2, "Page": 1]), 
... 
(key: "TOORL002B", value: ["Position": 1, "Page": 2]), 
(key: "CGLYN188", value: ["Position": 2, "Page": 2]), 
... 
] 

Ici vous pouvez download the playground.

+0

Parfait. Fonctionne un régal pour ce dont j'ai besoin. Merci. –

+0

Petit peu d'amélioration, considérons d'abord Position puis Page. – iMuzahid

+0

@ Md.MuzahidulIslam cela entraînerait une mauvaise commande. Le PO souhaite trier les entrées par page d'abord, puis par position. – ozgur

0

Vous pouvez trier par dictionnaire clé et la valeur

extension Dictionary where Value:Comparable { 
    var sortedByValue:[(Key,Value)] {return Array(dict).sorted{$0.1 < $1.1}} 
} 

extension Dictionary where Key:Comparable { 
var sortedByKey:[(Key,Value)] {return Array(dict).sorted{$0.0 < $1.0}} 
} 

["b":2,"a":1,"c":3].sortedByKey// output will be a:1, b:2, c:3 
["b":2,"a":1,"c":3].sortedByValue//output will be a:1, b:2, c:3