web-dev-qa-db-fra.com

Devez-vous vérifier s'il y a un doublon avant de l'insérer dans un jeu?

J'apprends à utiliser des ensembles. Ma question est la suivante: les ensembles ne contiennent pas de doublons. Lorsque nous essayons d'insérer des doublons, cela ne génère aucune erreur et supprime automatiquement les doublons. Est-ce une bonne pratique de vérifier chaque valeur avant d’insérer dans un ensemble, qu’elle existe ou non? Ou est-ce correct de faire quelque chose comme le code ci-dessous? Je pense que Java ferait la vérification en interne en utilisant .contains(value). Qu'est-ce que tu penses?

Quelle serait la complexité de Big O dans les deux cas considérant qu'il y a des éléments n entrant dans l'ensemble?

import Java.util.HashSet;
import Java.util.Set;

public class DuplicateTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
         Set<Integer> mySet = new HashSet<Integer>();

         mySet.add(10);
         mySet.add(20);
         mySet.add(30);
         mySet.add(40);
         mySet.add(50);
         mySet.add(50);
         mySet.add(50);
         mySet.add(50);
         mySet.add(50);
         mySet.add(50);

         System.out.println("Contents of the Hash Set :"+mySet);
    }

}
20
Zack

Selon les docs :

public boolean add(E e)

Ajoute l'élément spécifié à cet ensemble s'il n'est pas déjà présent. Plus formellement, ajoute l'élément spécifié e à cet ensemble si cet ensemble ne contient aucun élément e2 tel que (e == null? E2 == null: e.equals (e2)). Si cet ensemble contient déjà l'élément, l'appel laisse l'ensemble inchangé et renvoie false.

Donc, la méthode add() vous renvoie déjà un vrai ou un faux. Donc, vous n'avez pas besoin de faire la vérification supplémentaire.

21
Atri

Comparez avec la documentation API de Set.add(E)

La méthode add vérifie si l'élément est déjà dans la Set. Si l'élément est déjà présent, le nouvel élément n'est pas ajouté et la variable Set reste inchangée. Dans la plupart des cas, vous n'avez rien à vérifier.

La complexité de la méthode dépend de l’implémentation concrète de Set que vous utilisez.

9
Alejandro Goñi

C'est ok pour ne pas vérifier. C'est le principal avantage par rapport aux ensembles de listes, car ils filtreront automatiquement les doublons.

HashSet a des performances constantes dans le temps ( http://docs.Oracle.com/javase/8/docs/api/Java/util/HashSet.html )

Cette classe offre des performances constantes dans le temps pour les opérations de base (ajout, suppression, contenu et taille), en supposant que la fonction de hachage disperse correctement les éléments entre les compartiments.

4
DMozzy

La fonction add renvoie un booléen que vous pouvez vérifier pour déterminer si l'élément était déjà dans l'ensemble. Ceci est bien sûr basé sur vos besoins et n'est pas une meilleure pratique. Il est bon de savoir qu’il ne supprime pas un élément déjà présent. Vous ne pouvez donc pas compter sur lui pour mettre à jour la valeur existante avec de nouvelles informations si vous définissez des équivalents sur la base de clés de substitution de votre base de données. Ceci est opposé à la façon dont les cartes fonctionnent car une carte retournera toute valeur existante et la remplacera par la nouvelle valeur.

2
Greg L.

Voici les réponses à vos questions:

Lorsque nous essayons d'insérer des doublons, cela ne génère aucune erreur et Supprime automatiquement les doublons.

Votre compréhension n'est pas correcte. L'appel à Set.add() n'ajoutera pas de nouvel élément s'il est déjà dans l'ensemble; cette déclaration s'applique à toutes les implémentations de Set, y compris HashSet et TreeSet.

Est-ce une bonne pratique de vérifier chaque valeur avant d'insérer dans l'ensemble Si elle existe ou non? ou est-il acceptable de faire quelque chose comme le code ci-dessous ? Je pense que Java ferait la vérification en interne en utilisant .Contains (value). Qu'est-ce que tu penses?

Étant donné que votre compréhension était incorrecte dès le départ, vous n'avez pas besoin de vérifier chaque valeur avant de l'insérer dans l'ensemble pour voir si elle existe déjà. Oui, en interne, il fait quelque chose comme contains().

Quelle serait la complexité de Big Oh dans les deux cas considérant Il y a "n" éléments entrant dans la série?

Pour HashSet, la complexité temporelle est O(1) pour chaque add(). Pour TreeSet() - que vous n'avez pas utilisé - la complexité temporelle est O(lg N) pour chaque add().

1