java - IdentitySet/IdentityHashSet(使用 IdentityHashMap)

标签 java set javafx-8 observable identity-map

我知道 IdentityHashMap ,但我需要使用类似 "IdentitySet" 的东西(使用 equals 作为 o1 == o2 )。我将使用一个“提取器”( JavaFX )来收听 Observable 列表:

 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());
            }
        }
    });
人物类:
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()};
}
我需要覆盖 equalshashCode解决我的其他问题。
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;

最佳答案

从 map 制作一组
谢谢, @BoristheSpider
Collections.newSetFromMap(...) , 返回 Set由指定的 map 支持(在我的情况下 ➡️ 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());
标准输出 ( 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());
标准输出 ( 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());
标准输出 ( pretty-print ):
[
  Person{
    s=StringProperty [value: a], 
    d=DoubleProperty [value: 1.0]
  }
]

关于java - IdentitySet/IdentityHashSet(使用 IdentityHashMap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48083029/

相关文章:

java - 双向绑定(bind)两个不同值的属性时取哪个值?

java - 如何应对从另一个应用程序获得焦点?

java - 如何在使用中间结果时拆分和连接字符串?

java - 如何使用hibernate查询方法从多个相似记录中获取最新/热门记录

java - 带有动态 XSD 的 WSDL

python - 为什么我可以在 Python 的集合中添加 bool 值 False 而不是 True?

c++ - 将多集转换为集合的有效方法

java - 如何将匿名类重新集成到 ECD 反编译器生成的 Java 代码中?

java - 比较集合内的对象

JavaFX SceneBuilder 将无法启动