Comment trier struct avec de multiples paramètres de tri?
J'ai un tableau/tranche de membres:
type Member struct {
Id int
LastName string
FirstName string
}
var members []Member
Ma question est de savoir comment trier par LastName
puis par FirstName
.
- Avez-vous eu un coup d'oeil à l'exemple donné dans la documentation officielle de paquet de tri? golang.org/pkg/sort/#example__sortMultiKeys
- Depuis Aller 1.8, @abourget la réponse est mieux (car plus courte) que celle actuellement reconnus.
Vous devez vous connecter pour publier un commentaire.
Utiliser le de tri.Tranche (disponible depuis Aller 1.8) ou le de tri.Tri fonction pour trier une tranche de valeurs.
Avec les deux fonctions, l'application dispose d'une fonction qui teste si une tranche élément est inférieure à une autre tranche de l'élément. Pour trier par nom puis prénom, comparer les nom puis prénom:
Le moins fonction est spécifiée à l'aide d'une fonction anonyme à trier.Tranche:
Le moins fonction est spécifiée par le biais d'un interface avec le tri.Fonction de tri:
Moins que l'exercice l'analyse montre que le tri est un point chaud, utilisez la fonction qui convient le mieux pour votre application.
Utiliser la plus récente
sort.Slice
de la fonction en tant que telle:ou quelque chose comme ça.
sort.Stable
ousort.SliceStable
.Un autre modèle, que je trouve un peu de nettoyant:
Le plus court et toujours compréhensible code, j'ai réussi à écrire pour ce qui est:
Le modèle à l'aide de la
switch
déclaration s'étend facilement à plus de deux critères de tri et est encore assez court pour être lu.Voici le reste du programme:
Une toute autre idée, mais même API
Si vous voulez éviter de mentionner les champs
LastName
etFirstName
plusieurs fois et si vous voulez éviter de mélangeri
etj
(ce qui peut arriver tous les sens), j'ai joué un peu et l'idée de base est:Depuis Go ne prend pas en charge la
->
opérateur pour la création de fonctions anonymes et n'ont pas de génériques, comme Java, un peu de syntaxe supplémentaire n'est nécessaire:La mise en œuvre ainsi que l'API est un peu moche à l'aide de
interface{}
et de réflexion, mais il ne mentionne que chaque champ une fois, et le code de l'application n'a pas une seule chance de accidentellement mélanger les indicesi
etj
car il n'a pas affaire avec eux.J'ai conçu cette API dans l'esprit de Java Comparateur.la comparaison.
L'infrastructure de code ci-dessus par le trieur:
Cela a été très utile. J'ai besoin de trier une tranche de structures, et trouvé ma réponse ici. J'ai effectivement étendu à triplement de tri. Bien que le tri de ce bien n'est pas optimal pour l'exécution, il est utile dans certaines circonstances, en particulier lorsque la solution conduit à un code qui est difficile à maintenir ou à modifier et où plus rapidement exécution n'est pas crucial.
Ce code trie d'abord par code, puis par groupe, puis par IDGroup.
Ici est un peu plus concis mise en œuvre de la accepté de répondre:
En cours d'exécution imprimer les résultats suivants:
C'est comme prévu: les membres sont imprimés dans l'ordre croissant de nom de famille, où, dans le cas d'une cravate, ils sont imprimées dans l'ordre des prénoms.