I know about IdentityHashMap
, but I need to use to something like "IdentitySet"
(use equals
as o1 == o2
). I’m going to use one to listen Observable list with “extractor” (JavaFX):
List<Person> deleteList = new ArrayList<>(); List<Person> addList = new ArrayList<>(); ObservableList<Person> list = FXCollections.observableArrayList(Person.extractor()); list.add(new Person("a",1)); list.add(new Person("b",2)); list.add(new Person("c",3)); list.addListener((ListChangeListener<Person>) observable -> { if(observable.next()) { if (observable.wasAdded()) { addList.addAll(observable.getAddedSubList()); } if (observable.wasUpdated()) { deleteList.add(list.get(observable.getFrom())); } if (observable.wasRemoved()) { deleteList.addAll(observable.getRemoved()); } } });
Person class:
public class Person { private final StringProperty s; private final DoubleProperty d; //Getters and Setters // ... @Override public int hashCode() { int result = s != null ? s.getValue().hashCode() : 0; result = 21 * result + (d != null ? Double.hashCode(d.getValue()) : 0); return result; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (!s.getValue().equals(person.s.getValue())) return false; return d.getValue().equals(person.d.getValue()); } /** *Extractor to observe changes in "Property" fields. * @return extractor */ public static Callback<Person, Observable[]> extractor() { return (Person p) -> new Observable[]{p.sProperty(), p.dProperty()}; }
I need to override equals
and hashCode
to solve my other issues.
Person p = new Person("a",1); Set<Object> persons = new HashSet<>(); persons.add(p); p.setD(999); persons.add(p); System.out.println(persons.size()); // size = 2; persons.remove(p); System.out.println(persons.size()); // size = 1;
Advertisement
Answer
Make a set from a map
thx, @BoristheSpider
Collections.newSetFromMap(…), returns a Set
backed by the specified map (in my case ➡️ IdentityHashMap
):
// get IdentytitySet wich wrap IdentityHashMap Set<Person> persons = Collections.newSetFromMap(new IdentityHashMap<>()) // test Person p = new Person("a",1); Person p2 = new Person("a",1); persons.add(p); persons.add(p2); System.out.println(persons.toString());
stdout (pretty print):
[ Person{ s=StringProperty [value: a], d=DoubleProperty [value:1.0] }, Person{ s=StringProperty [value: a], d=DoubleProperty [value: 1.0] } ]
p.setD(999); persons.add(p); System.out.println(persons.toString());
stdout (pretty print):
[ Person{ s=StringProperty [value: a], d=DoubleProperty [value: 999.0] }, Person{ s=StringProperty [value: a], d=DoubleProperty [value: 1.0] } ]
persons.remove(p) System.out.println(persons.toString());
stdout (pretty print):
[ Person{ s=StringProperty [value: a], d=DoubleProperty [value: 1.0] } ]