LinkedHashSet supprimer les doublons objet
J'ai une question simple à vous, j'ai de la classe de Produits qui ont des champs comme ceci:
private Integer id;
private String category;
private String symbol;
private String desc;
private Double price;
private Integer quantity;
Je veux supprimer les doublons élément de LinkedHasSet basée sur l'ID, e de.g les Produits qui ont le même ID mais diffrent quantité ajouter au jeu, je veux supprimer (mise à jour) des produits avec le même ID, et il sera de mon identifiant unique de l'objet, comment le faire?
e.g
Produit: id=1, catégorie=CCTV, symbole=TVC-DS, desc=Simple Appareil photo, prix=100.00, quantité=1
Produit: id=1, catégorie=CCTV, symbole=TVC-DS, desc=Simple Appareil photo, prix=100.00, quantité=3
ne sera pas ajouté à définir
mon code:
public void setList(Set<Product> list) {
if(list.isEmpty())
this.list = list;
else {
this.list.addAll(list);
Iterator<Product> it = this.list.iterator();
for(Product p : list) {
while(it.hasNext()) {
if(it.next().getId() != p.getId())
it.remove();
this.list.add(p);
}
}
}
}
Je n'ai pas vraiment compris: le jeu ne peut contenir de produits qui ont des Identifiants différents, quelles que soient leurs autres attributs (quantité, mais aussi de la catégorie, symbole, etc.), droit?
Oui, l'IDENTIFIANT unique de l'objet sera Produit.id
Tout cela à propos de votre
Oui, l'IDENTIFIANT unique de l'objet sera Produit.id
Tout cela à propos de votre
equals()
et hashCode()
mise en œuvre. essayez de remplacer ces méthodes de manière adéquate.OriginalL'auteur insict | 2013-02-07
Vous devez vous connecter pour publier un commentaire.
Tous
Set
implémentations de supprimer les doublons et lesLinkedHashSet
n'est pas une exception.La définition de la double est deux objets sont égaux les uns aux autres, en fonction de leur
equals()
méthode. Si vous n'avez pas remplacéequals
sur votreProduct
classe, puis seulement deux références identiques seront considérés comme égaux - pas différentes instances avec les mêmes valeurs.Si vous avez besoin d'ajouter un plus spécifiques de mise en œuvre de
equals
(ethashcode
) pour votre classe. Pour certains des exemples et des conseils, consultez Primordial equals et hashcode en Java. (Notez que vous doit remplacerhashcode
aussi bien, sinon, votre classe sera de ne pas se comporter correctement dans hachage ensembles.)Non, le LinkedHashSet appellera
equals
lui-même à l'interne, et ne sera pas insérer un élément qui est égale à celle qui existe déjà dans le jeu. Si vous voyez des "doublons" dans votre jeu, puis la méthode equals ne doit pas être défini de la façon dont vous vous attendez - vous devez disposer de deux doublesa
etb
tels quea.equals(b)
renvoie la valeur false. (Ou, comme c'est une base de hachage ensemble,a.hashCode() != b.hashCode()
)Vous pouvez conserver la valeur par défaut substituée hashcode de la mise en œuvre d'eclipse, votre Produit classe devrait avoir la logique de renvoyer false lorsque la référence du produit est égale par rapport à un autre objet, et toutes les autres propriétés peuvent être décochée pour l'égalité... Ne pas oublier de traiter transitive, réflexive et symétrique equlality pour les objets
mais comment faire quand dans la méthode equals signature j'ai du type d'Objet, et le compilateur ne sait pas qu'il va être Produit. Je ne peux pas utiliser générique dans la signature de la méthode, car il ne sera pas remplacé
Votre
equals()
méthode est implémentée mal. Vous devriez comparer l'objet de champs, pas de lahashCode()
résultat. Il y a une chance que complètement différents objets de retourner le même code de hachage. Vous devez d'abord apprendre les tables de hashage et pourquoi il est important de mettre en œuvreequals()
ethashCode()
correctement. Indépendamment de cela, même si vous mettez en œuvreequals()
correctement, vous avez des problèmes de conception dans le code, ce qui va entraîner d'autres problèmes plus tardOriginalL'auteur Andrzej Doyle
Je ne vais pas vous donner de réponse claire, mais un couple de conseils.
Product
dans unSet
vous avez besoin pour mettre en œuvre sesequals()
ethashCode()
méthodes.equals()
que vous aurez à décider ce que "l'égalité" pour unProduct
signifie, (Set
peut contenir qu'un seul exemple en termes sur "l'égalité"). Par exemple, si deuxProduct
instances sont "égaux" est-il suffisant si ils ont la même ID ou doit-on aussi prendre quantité en compte?. Il n'est pas facile de répondre à cette question dans votre cas, mais s'il vous plaît lire sur.Product
instances en mémoire avec différentesquantities
, parce que l'un d'entre eux représentent un état qui est incorrect (ie. produit en particulier la quantité peut être 1 ou 3, pas les deux à la fois).Je pense que la conception n'est pas entièrement correct.
Product
classe dans votre cas représente une description générale du produit (y compris le prix), doncquantity
ne correspond vraiment pas là. Si quelqu'un peut commander un couple de copies deProduct
je pense que vous devriez créer une autre classe commeOrder
ouOrderLine
qui indique qu'un produit est commandé et la quantité correspondante, par exemple:Avec la conception de ce genre, il est facile de répondre à la question à partir du point 2.
Product.equals()
doit comparer l'ID seulement, etOrderLine.equals()
le produit (ID) et quantité.Order
classe avec de simples setter et getter méthodes et ajoute remplacé hashCode et equals méthodes?J'utilise la catégorie de Produits dont la quantité est parce que j'utilise dans la Datatable composant à l'aide du sélecteur de colonne, de sorte qu'il est assez complexe à mettre en œuvre à l'aide de deux de la classe.
Je ne comprends pas tout ce que "Datatable composant à l'aide du sélecteur de colonne", mais si vous venez seul tableau qui contient à la fois la description du produit, le prix et la quantité, puis la DB design est aussi mauvais et c'est probablement à l'origine de vos problèmes. Vous devriez avoir une table pour le Produit (et ses descriptions) et un autre pour les Commandes (qui a une clé étrangère du Produit, et une colonne de quantité). L'Ordre a généralement son propre ID.
vos réponses ont été très utiles, merci pour cette
mais quand j'ai OrderLine de classe i doit de créer de nouveaux
equals
ethashCode
méthodes pour définir l'ID unique, c'est vraiment compliquéOriginalL'auteur Adam Dyga
Je vous suggère de mettre en place votre propre fonction de hachage d'une manière qu'il hachages éléments avec une égale ID-s avec le même code. Cela permettra de résoudre votre problème, sans avoir à coder explicitement.
OriginalL'auteur Ivaylo Strandjev
Le code semble être ajouter à la liste deux fois. Une fois au cours de la
addAll()
appel, puis de nouveau au cours de l'itération. Dans ce cas, je crois que le deuxième itération devrait suffire. La comparaison doit également être modifié pour utiliserequals
au lieu de==
OriginalL'auteur Kevin Bowersox
Comme d'autres l'ont déjà dit, vous aurez besoin de mettre en œuvre (override)
equals()
,hashCode()
et (prefarably)compareTo()
deComparable
interface. Ces méthodes, si pas mis en œuvre correctement, peut aboutir à des comportement d'exécution. Difficile de déboguer les problèmes. Par conséquent, je vous suggère d'utiliserApache Commons
EqualsBuilder
,HashcodeBuilder
etComparableBuilder
de mise en œuvre de ces méthodes. Un exemple d'utilisation deApache Commons builder
peut être vu dans ce lien http://www.javaworld.com/community/node/1859OriginalL'auteur Bimalesh Jha