8
votes

Bonne façon générale de trier les nuls au fond, peu importe?

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?

Offhand:

  • écrivez simplement une ascension distincte et Comparateurs descendants, code de partage Si possible
  • délégué null manipulation à une autre classe, soit en lançant une NPE ou en l'appelant explicitement
  • inclure un drapeau ascendant et mettre Logique conditionnelle pour naviguer autour des nulls
  • enveloppez des comparateurs réguliers dans un Classe de manutention null

    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.


0 commentaires

5 Réponses :


6
votes

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 ReverseComparator CODE> ainsi qu'un NULLWRAppComParator code>.


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 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>

Cette implémentation est incorrecte (en supposant que original code> est le comparateur à inverser): p> xxx pré>

mais c'est vrai:

public int compare(T x, T y)
{
    return original.compare(y, x);
}


2 commentaires

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.



12
votes

Je suis d'accord avec Jon Skeet (c'est si facile :). J'ai essayé de mettre en place une très simple décorateur : xxx

donné Un comparateur: xxx

et quelques données de test: xxx

Vous pouvez trier avec des nulls à la fin: xxx xxx

ou au début: xxx xxx


2 commentaires

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 retourner 0 ou jeter une exception lorsque vous avez passé deux nulls, sinon il désobéit au contrat d'interface.



6
votes

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: xxx

crédit complet à la DFA, cependant - il s'agit simplement d'une modification mineure de son travail.


1 commentaires

Un problème: vous ne retournez pas 0 lorsque vous comparez deux nuls.



2
votes

Vous pouvez toujours utiliser Nullcomparator des collections des communes. Cela fait longtemps que Google Collections.


0 commentaires

5
votes

en Java 8, vous pouvez utiliser le 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: xxx pré>

si vous souhaitez trier un tas de fruits de leur taille et mettre le null code > S à la fin: p> xxx pré>

Vous pouvez simplement écrire: p>

[Fruit{name='Kiwi', size=5}, Fruit{name='Orange', size=25}, null]


0 commentaires