le tri d'un rubis tableau d'objets par un attribut qui pourrait être nul
J'ai un tableau d'objets que j'ai besoin de trier par position d'attribut qui pourrait être un entier positif ou nul, et j'ai besoin de les objets qui ont le néant position d'être à la fin du tableau. Maintenant, je peux forcer la position de retourner de la valeur plutôt que le néant, de sorte que le tableau.le tri n'est pas en panne, mais si je utiliser 0 comme ce défaut, il met les objets à l'avant de la sorte. Quelle est la meilleure façon de faire ce genre? dois-je tout simplement définir le néant à des valeurs ridiculement grand nombre qui est "presque" toujours la garantie d'être à la fin? ou est-il un autre moyen que je pourrais causer le tableau.méthode de tri pour mettre le néant des objets d'attribut à la fin du tableau? le code ressemble à ceci:
class Parent
def sorted_children
children.sort{|a, b| a.position <=> b.position}
end
end
class Child
def position
category ? category.position : #what should the else be??
end
end
maintenant, si je fais le 'else' quelque chose comme 1000000000, alors il est plus probable va les mettre à la fin du tableau, mais je n'aime pas cette solution car il est arbitraire
Vous devez vous connecter pour publier un commentaire.
Dans la
Child
définition<=>
être basé surcategory.position
sicategory
existe, les éléments de tri et sanscategory
comme toujours plus que ceux avec uncategory
?Puis dans
Parent
vous pouvez les appelerchildren.sort
.Je voudrais juste modifier le son de votre genre à mettre
nil
dernier. Essayez quelque chose comme ça.Qui dit que: si a et b sont à la fois non-nul de les trier normalement, mais si l'un d'eux est nul, le retour à un statut sortes que l'un des plus grands.
foo.sort { |a,b| a <=> b || (b && 1) || -1 }
- Je traiter ces sortes de choses de ce genre:
nil <=> nil
retourne 0. À l'aide de vaisseau spatial entre le néant et rien d'autre retourne généralement nulle, mais nulle et lui-même renvoie 0. En conséquence,[1, nil, 2] <=> [1, nil, 3]
retourne-1
. En conséquence, aussi longtemps que il ya une valeur plus tôt dans le tableau (c 0 / 1 pour les non-néant-néant) qui divise le néant, les valeurs de la non-néant valeurs, alors il devrait être sûr d'utiliser le néant.Pour être juste, je ne suis pas très familier avec Ruby, afin de prendre cela comme un algorithme idée plutôt qu'un code... et réécrire l' ?: opérateur de ce que Ruby a c'est plus propre.
Ne pouvez pas vous seulement de vérifier néant dans la comparaison:
Modifiées à utiliser Glenra du code qui implémente la même chose que la mienne, mais dans une plus petite (et probablement plus facile à lire) quantité de code.
Je n'ai pas fait de Rubis dans un moment, mais vous pouvez diviser le null-vérification de la tri (et juste permettre à l'Enfant#position pour retourner null):
Certes ce n'est pas la solution la plus efficace, mais il n'a pas de numéros de magie.
Vous pouvez le faire sans écraser le vaisseau spatial de l'opérateur par la définition d'une nouvelle méthode de comparaison.
La
sort
méthode peut prendre un bloc, de sorte que vous pouvez les trier à l'aide de cette nouvelle méthode:La solution la plus simple pour moi est