Comment puis-je comparer les deux tableau liste pour l'égalité avec un comparateur?
Pour être plus précis, j'ai deux listes:
List<SystemUserWithNameAndId> list1;
List<SystemUserWithNameAndId> list2;
Je veux vérifier s'ils contiennent les mêmes utilisateurs du système et la commande n'est pas un problème. J'ai essayé d'utiliser un comparateur pour les trier d'abord et ensuite de vérifier si elles sont équivalentes à l'aide de la méthode equals() de listes. Mais je ne veux pas surcharger la méthode equals pour SystemUserWithNameAndId et je me demandais si je pouvais utiliser le comparateur que j'ai créé pour le tri (ou similaire) pour vérifier l'égalité, sans explicitement itération sur les listes après le tri.
Comparator<SystemUserWithNameAndId> systemUserComparator = new Comparator<SystemUserWithNameAndId>()
{
@Override
public int compare(SystemUserWithNameAndId systemUser1, SystemUserWithNameAndId systemUser2)
{
final int systemUserId1 = systemUser1.getSystemUserId();
final int systemUserId2 = systemUser2.getSystemUserId();
return systemUserId1 == systemUserId2
? 0
: systemUserId1 - systemUserId2;
}
};
Collections.sort(systemUsers1, systemUserComparator);
Collections.sort(systemUsers2, systemUserComparator);
return systemUsers1.equals(systemUsers2);
Idéalement, je veux être en mesure de dire,
CollectionUtils.isEqualCollections(systemUsers1, systemUsers2, someCustomComparator);
Pourquoi ne voulez-vous pas remplacer
Ou vous pourriez faire un SystemUsersList qui s'étend de la Liste et de remplacer des égaux, alors que vous pourriez appeler: list1.equals(liste 2);
Le code que j'ai posté est une partie d'une classe de test et de la façon dont je suis la comparaison de deux
Êtes-vous à l'aide de Java 8?
Je voudrais répondre, mais la question n'est pas encore claire. Est l'OP qui veulent tester si les deux listes contiennent les mêmes éléments selon la
SystemUserWithNameAndId.equals()
? Avez-vous déjà remplacé?Ou vous pourriez faire un SystemUsersList qui s'étend de la Liste et de remplacer des égaux, alors que vous pourriez appeler: list1.equals(liste 2);
Le code que j'ai posté est une partie d'une classe de test et de la façon dont je suis la comparaison de deux
SystemUserWithNameAndId
objets n'est pas la méthode par défaut de les comparer.Êtes-vous à l'aide de Java 8?
Je voudrais répondre, mais la question n'est pas encore claire. Est l'OP qui veulent tester si les deux listes contiennent les mêmes éléments selon la
Comparator
(comme JBNizet a assumé), ou est le Comparator
juste un moyen de tester si les deux listes contiennent les mêmes éléments à l'égard de equals
? Dans la question, les OP trie la liste en utilisant Comparator
et vérifie ensuite si les listes sont les mêmes en comparant les éléments avec equals()
, qui n'a aucun sens.OriginalL'auteur Bruce Wayne | 2015-05-07
Vous devez vous connecter pour publier un commentaire.
Mettre en œuvre la méthode qui effectue une itération, et de le réutiliser à chaque fois que vous en avez besoin:
Set
, mais pour cela, pas assez de renseignements ont été fournis)Dès que vous avez écrit ce générique réutilisable méthode, vous ne jamais "explicitement" en boucle. Vous "implicitement" en boucle par l'appel de la méthode. Il n'y a aucun moyen de comparer des éléments de listes sans boucle. Et depuis le JDK ne fournit pas un tel utilitaire méthode, vous avez besoin d'en écrire un.
C'est précisément ce que j'espérais, j'ai pu éviter, mais si vous êtes sûr qu'il n'y a pas de fonction d'utilité pour ce faire, je vais avoir recours à ce que vous avez recommandé.
vous devez effectuer une itération sur les plus grands, sinon le areEqualIgnoringOrder donnera de mauvais résultats. Exemple: Liste a = [1,2,3], la Liste b = [1,2,3,4]. areEqualIgnoringOrder(a,b, comparateur) retournera true.
la première chose que la méthode n'est pour comparer les tailles des listes, qui doit être égal.
OriginalL'auteur JB Nizet
Voici un Java 8 chemin de la résolution de votre problème. Assurez-vous d'abord les listes sont de longueur égale:
Maintenant construire un Comparateur en utilisant le nouveau comparateur des services publics. L'idée est qu'au lieu d'écrire la logique personnalisée pour un élément de comparaison, la plupart des comparateurs de faire quelque chose comme de la comparaison de deux objets par l'extraction de la clé de la, et en comparant ensuite les touches. C'est ce que ce n'.
Trier les listes. Bien sûr, vous pouvez faire des copies avant de les trier si vous ne voulez pas que votre fonction pour l'effet de bord de tri de ses commentaires. Si votre entrée listes ne sont pas d'accès aléatoire (qui utilise
LinkedList
de nos jours?) vous pouvez aussi copier àArrayList
s pour faciliter l'accès aléatoire.Exécuter un flux sur l'index de la liste, en appelant le comparateur sur chaque paire. Le comparateur retourne 0 si les éléments sont égaux en fonction de cette comparaison. Si cela est vrai pour toutes les paires d'éléments, les listes sont égales.
Pas de problème. Vous pouvez facilement utiliser
equals
ou une autre base de comparaison dans le prédicat passé àallMatch
.Euh... Même si la question sur comparateur, pourquoi ne pas simplement utiliser un prédicateur, si seulement contrôle d'égalité est-elle nécessaire?
OriginalL'auteur Stuart Marks