IdentitySet/IdentityHashSet(使用 IdentityHashMap) [英] IdentitySet / IdentityHashSet (use IdentityHashMap)

查看:127
本文介绍了IdentitySet/IdentityHashSet(使用 IdentityHashMap)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 ListdeleteList = new ArrayList<>();列表<人>addList = new ArrayList<>();ObservableListlist = 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) observable -> {if(observable.next()) {如果 (observable.wasAdded()) {addList.addAll(observable.getAddedSubList());}如果(observable.wasUpdated()){deleteList.add(list.get(observable.getFrom()));}如果 (observable.wasRemoved()) {deleteList.addAll(observable.getRemoved());}}});

人物类:

public class Person {私人最终 StringProperty s;私有最终 DoubleProperty d;//获取器和设置器//...@覆盖公共 int hashCode() {int 结果 = s != null ?s.getValue().hashCode() : 0;结果 = 21 * 结果 + (d != null ? Double.hashCode(d.getValue()) : 0);返回结果;}@覆盖公共布尔等于(对象 o){if (this == o) 返回真;if (o == null || getClass() != o.getClass()) 返回假;人人 = (人) o;如果 (!s.getValue().equals(person.s.getValue())) 返回 false;返回 d.getValue().equals(person.d.getValue());}/***用于观察属性"变化的提取器;领域.* @return 提取器*/公共静态回调提取器(){返回 (Person p) ->new Observable[]{p.sProperty(), p.dProperty()};}

我需要覆盖 equalshashCode 来解决我的其他问题.

Person p = new Person("a",1);设置<对象>人 = 新 HashSet<>();人员添加(p);p.setD(999);人员添加(p);System.out.println(persons.size());//大小 = 2;people.remove(p);System.out.println(persons.size());//大小 = 1;

解决方案

从地图制作一个集合

谢谢,@BoristheSpider

Collections.newSetFromMap(...),返回一个由指定映射支持的Set(在我的例子中➡️IdentityHashMap):

//获取包含 IdentityHashMap 的 IdentytitySet设置<人>人员 = Collections.newSetFromMap(new IdentityHashMap<>())//测试人 p = new Person(a",1);Person p2 = new Person(a",1);人员添加(p);人员添加(p2);System.out.println(persons.toString());

stdout(漂亮的印刷品):

<预><代码>[人{s=StringProperty [值:a],d=DoubleProperty [值:1.0]},人{s=StringProperty [值:a],d=DoubleProperty [值:1.0]}]

p.setD(999);人员添加(p);System.out.println(persons.toString());

stdout(漂亮的印刷品):

<预><代码>[人{s=StringProperty [值:a],d=DoubleProperty [值:999.0]},人{s=StringProperty [值:a],d=DoubleProperty [值:1.0]}]

persons.remove(p)System.out.println(persons.toString());

stdout(漂亮的印刷品):

<预><代码>[人{s=StringProperty [值:a],d=DoubleProperty [值:1.0]}]

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;

解决方案

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]
  }
]

这篇关于IdentitySet/IdentityHashSet(使用 IdentityHashMap)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆