7
votes

Empêcher les entrées en double en arraylist

dise que je crée une classe d'objets comme xxx pré>

maintenant, je veux créer une arrayliste pour contenir un certain nombre de catégories d'objets comme. p>

"Star Wars", 4


2 commentaires

On dirait que vous voulez plutôt utiliser une java.Util.map à la place.


Je pense que la meilleure approche serait de mettre en œuvre une liste "sans doublons". Voir ma réponse ici: Stackoverflow.com/a/35788695/130028


5 Réponses :


4
votes

Si vous souhaitez avoir un ensemble d'objets uniques, utilisez définir au lieu de la liste .

Aussi, si vous souhaitez définir vous-même par vous-même lorsque des objets sont considérés comme égaux, envisagez de remplacer le égale et hashcode méthodes de la classe.


4 commentaires

Cela ne serait pas rationnel avec la sémantique générale de la fonction égale () .


Nouvelle chose ("Star Wars", 3) et Nouvelle chose ("Star Wars", 1) sont deux objets différents.


Je suis d'accord avec le commentaire de Hunter, si vous avez créé un jeu de type, il ne serait pas "Star Wars", 3 et "Star Wars", 1 être considéré comme des objets uniques?


Vous pouvez remplacer la méthode Equals () pour le forcer à fonctionner comme ceci, mais que Vincent mentionne cela viole le contrat général d'égaux ().



0
votes

Si vous souhaitez utiliser la liste enfin que vous écrivez votre comparateur ,

En écrivant le comparateur, vous pouvez créer un comportement comme défini.


1 commentaires

Comment le comparateur résoudra son problème lorsque ArrayList # Ajouter Il suffit d'insérer l'élément à la fin de la matrice intérieure?



1
votes

IMHO, il est plus logique d'utiliser une carte au lieu de la liste ou d'un mappe si vous ne voulez pas changer votre classe.


0 commentaires

4
votes

Vous devriez créer votre propre méthode pour vérifier si le champ Le champ Le champ de la classe a été défini sur "Star Wars", puis Ajouter au numéro correspondant domaine de la classe, c'est une solution possible.

Une autre solution consiste à utiliser une carte avec le champ Nom comme clé et le champ NON comme valeur.

ex: xxx

espère que cela aide.


5 commentaires

Il n'a pas de sens de mettre la carte dans la catégorie


@Luiggimendoza C'est juste un exemple. L'OP peut mettre le nom où qu'ils veulent.


Si chose est une classe modèle, pourquoi devriez-vous mettre un conteneur qui stocke uniquement les données de l'objet actuel?


@Luiggimendoza hmm ouais je suppose que cela n'a pas vraiment de sens, chaque chose aurait sa propre carte.


Vous devez éditer votre réponse et utiliser une autre classe qui a le conteneur. Ceci est un mauvais échantillon de la carte Utilisation



1
votes

Vous devez remplacer la méthode forte> Equals forte> et Méthode HashCode Strong> dans votre truc de cette catégorie: xxx pré>

alors vous pourriez utiliser De cette façon: P>

ArrayList<Thing> myList = new ArrayList<>();

Thing first = new Thing("Star Wars", 3);

if(!myList.contains(first)){
   myList.add(first);
}

Thing second = new Thing("Star Wars", 1);

if(!myList.contains(second)){
   myList.add(second);
}


0 commentaires