J'écris des comparateurs personnalisés et j'aimerais qu'ils apportent des articles nuls au bas de la liste, que je sois trié en ascendant ou descendant. Qu'est-ce qu'une bonne stratégie ou modèle pour approcher cela? p>
Offhand: p>
Toute autre stratégie? J'aimerais entendre parler des expériences de différentes approches et de tout piège pour les différentes stratégies. P>
5 Réponses :
La dernière option m'appelle beaucoup. Les comparateurs sont vraiment géniaux pour chaîner ensemble. En particulier, vous pouvez bien vouloir écrire un Edit: Vous n'êtes pas obligé d'écrire ceci vous-même. Si vous regardez le Commande classe dans le bibliothèque Google Collections Vous Trouvez ceci et toutes sortes d'autres goodies :) p> Edit: Entrer dans plus de détails pour montrer ce que je veux dire sur Cette implémentation est incorrecte (en supposant que mais c'est vrai: ReverseComparator CODE> ainsi qu'un
NULLWRAppComParator code>.
Reverecomparator P> P> P> P> P> P> P> Un mot d'avertissement - dans la mise en place d'un
réverseecomparator code>, inverser l'ordre des arguments au lieu de nier le résultat, comme autrement
integer.min_value code> est "inversé" à elle-même. p>
original code> est le comparateur à inverser): p>
public int compare(T x, T y)
{
return original.compare(y, x);
}
Je suis d'accord avec toute votre réponse, à l'exception de la négation du résultat d'un comparateur; Je serais assez malheureux si j'ai découvert qu'un comparateur mettait la mise en place d'une comparaison entière à l'aide de la soustraction, car cette méthode a tant de pièges.
J'accepte cette réponse en raison de la référence à la classe de commandes de Google Collections - Le code éprouvé existant est la meilleure solution. Aussi pour l'avertissement sur INTEGER.MIN_VALUE. Mais j'apprécie grandement le code de la DFA, ci-dessous et j'aimerais pouvoir accepter les deux réponses.
Je suis d'accord avec Jon Skeet (c'est si facile :). J'ai essayé de mettre en place une très simple décorateur : donné Un comparateur: p> et quelques données de test: p> Vous pouvez trier avec des nulls à la fin: p> ou au début: p>
Très agréable! Merci. Y a-t-il une raison de ne pas retourner 0 si les deux arguments sont nuls? Je sais que le comportement nul n'est pas tout à fait comme un comportement non nul, et que dire que deux nulls sont égaux est discutable - mais est-il moins discutable de dire que l'un dépasse l'autre?
@Carl: Exactement le point que je viens de faire à votre message :) Un comparateur devrait i> retourner 0 ou jeter une exception lorsque vous avez passé deux nulls, sinon il désobéit au contrat d'interface.
Suivi de la réponse de la DFA - ce que je veux, c'est que les NULLS trient à la fin sans affecter l'ordre des non-NULLS. Donc, je veux quelque chose de plus dans le sens de ceci: crédit complet à la DFA, cependant - il s'agit simplement d'une modification mineure de son travail. P> P>
Un problème: vous ne retournez pas 0 lorsque vous comparez deux nuls.
Vous pouvez toujours utiliser Nullcomparator code>
des collections des communes. Cela fait longtemps que Google Collections. P>
en Java 8, vous pouvez utiliser le si vous souhaitez trier un tas de fruits de leur taille et mettre le Vous pouvez simplement écrire: p> comparateur.nullslast code>
et comparateur.nullsfirst code>
méthodes statiques pour avoir plus de comparaison null conviviale. Supposons que vous ayez une classe code> code> comme suit: null code > S à la fin: p>
[Fruit{name='Kiwi', size=5}, Fruit{name='Orange', size=25}, null]