Comment utiliser les méthodes de collecte(removeAll() et retainAll()) pour les deux objets
Je m'attendais à un résultat en-dessous, mais en fait non. Même si elle a fonctionné quand j'ai essayé d'utiliser des chaînes de caractères à la place de l'Objet Item.
Je voudrais savoir pourquoi les raisons à ce sujet et comment le code afin d'obtenir le résultat escompté.Merci.
EXPECTED
------------------------------
removed object are:
2
same object are:
1
3
add object are:
4
------------------------------
ACTUAL
------------------------------
removed object are:
1
2
3
same object are:
add object are:
1
3
4
------------------------------
package com.javastudy;
import java.util.ArrayList;
import java.util.List;
public class CollectionCompareToObjects {
public static void main(String[] args) {
List<Item> before = new ArrayList<Item>();
List<Item> after = new ArrayList<Item>();
before.add(new Item(1L));
before.add(new Item(2L)); //delete
before.add(new Item(3L));
after.add(new Item(1L));
after.add(new Item(3L));
after.add(new Item(4L)); //added
List<Item> removed = new ArrayList<Item>(before);
removed.removeAll(after);
System.out.println("removed objects are:");
for(Item item : removed){
System.out.println(item.getId());
}
List<Item> same = new ArrayList<Item>(before);
same.retainAll(after);
System.out.println("same objects are:");
for(Item item : same){
System.out.println(item.getId());
}
List<Item> added = new ArrayList<Item>(after);
added.removeAll(before);
System.out.println("add objects are:");
for(Item item : added){
System.out.println(item.getId());
}
}
}
package com.javastudy;
public class Item {
Long id;
public Item(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
InformationsquelleAutor zono | 2010-12-16
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas mis en œuvre equals() de sorte que TOUS vos Articles sont des objets différents, certains ont un champ qui est le même.
Vous avez besoin d'implémenter equals.
Je vous conseille aussi l'utilisation de long au lieu de le Long, sauf si vous voulez id = null.
Vous devez remplacer la
equals(..)
méthode de votreItem
et de comparer le champ id (en gros, la méthode equals devrait simplement fairereturn id.equals(other.getId())
, avec le null-chèques.Avec équivaut vient et
hashCode()
- les deux méthodes doivent toujours être mises en œuvre ensemble, avec les mêmes champs.Et vous avez besoin de redéfinir ces méthodes, parce que le
removeAll
etretainAll
méthodes de travail par l'itération sur les collections et en comparant les éléments existants avec les éléments de la collection viaequals(..)
mettre en œuvre
equals()
ethashCode()
dans votre classe de l'élément, par exemple comme ceci:J'imagine qu'il fonctionne comme prévu après.
result
alors que la valeur est 1 (37*1 sera toujours 37)?return Objects.hash(id)
Vous devez remplacer la
equals
ethashCode
méthodes de votreItem
classe. Si vous n'avez pas Java utilise une valeur par défaut de mise en œuvre deequals
qui est équivalent à==
:Si vous mettez en œuvre
equals
correctement, alors la sortie serafalse
suivie partrue
.Lorsque vous instanciez deux fois un Élément de même avec le même paramètre, vous aurez 2 différents objets.
Deux solutions :