116 votes

Quelle est la façon la plus rapide de comparer deux ensembles en Java ?

J'essaie d'optimiser un morceau de code qui compare des éléments de liste.

Par exemple :

public void compare(Set<Record> firstSet, Set<Record> secondSet){
    for(Record firstRecord : firstSet){
        for(Record secondRecord : secondSet){
            // comparing logic
        }
    }
}

Veuillez tenir compte du fait que le nombre d'enregistrements dans les ensembles sera élevé.

Merci

Shekhar

19voto

husayt Points 4384

Il y a une méthode en goyave Sets qui peut aider ici :

public static <E>  boolean equals(Set<? extends E> set1, Set<? extends E> set2){
return Sets.symmetricDifference(set1,set2).isEmpty();
}

6voto

couling Points 2445

Il existe une solution O(N) pour des cas très spécifiques où :

  • les jeux sont triés
  • les deux triés dans le même ordre

Le code suivant suppose que les deux ensembles sont basés sur les enregistrements comparables. Une méthode similaire pourrait être basée sur un comparateur.

    public class SortedSetComparitor <Foo extends Comparable<Foo>> 
            implements Comparator<SortedSet<Foo>> {

        @Override
        public int compare( SortedSet<Foo> arg0, SortedSet<Foo> arg1 ) {
            Iterator<Foo> otherRecords = arg1.iterator();
            for (Foo thisRecord : arg0) {
                // Shorter sets sort first.
                if (!otherRecords.hasNext()) return 1;
                int comparison = thisRecord.compareTo(otherRecords.next());
                if (comparison != 0) return comparison;
            }
            // Shorter sets sort first
            if (otherRecords.hasNext()) return -1;
            else return 0;
        }
    }

6voto

ilopezluna Points 2010

Vous avez la solution suivante sur https://www.mkyong.com/java/java-how-to-compare-two-sets/

public static boolean equals(Set<?> set1, Set<?> set2){

    if(set1 == null || set2 ==null){
        return false;
    }

    if(set1.size() != set2.size()){
        return false;
    }

    return set1.containsAll(set2);
}

Ou si vous préférez utiliser un seul relevé de retour :

public static boolean equals(Set<?> set1, Set<?> set2){

  return set1 != null 
    && set2 != null 
    && set1.size() == set2.size() 
    && set1.containsAll(set2);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X