为了账号安全,请及时绑定邮箱和手机立即绑定

如何合并到具有部分相等对象的哈希集?

如何合并到具有部分相等对象的哈希集?

肥皂起泡泡 2023-06-04 19:44:31
我有一个 ArrayList ,其中包含每 n 秒更新一次并具有现有数据总量的data类型的对象。Person为了在表格中显示此数据,我使用了clear()ObservableList 并用于addAll(data)避免 GUI 故障。我想将 HashSet 用作 Observable Collection,我想知道是否有一种有效的方法可以从 HashSet 更新对象(如果它只是部分相等)。代码:class Person {   int id;   String name;   int visits;  //this value can be different   @Override   int hashCode() {   //...   }   @Override   boolean equals() {   //...   }}class Main {   static void main(String[] args) {      List<Person> data = new ArrayList<>();      data.add(new Person(1, Max, 4);      data.add(new Person(2, Richard, 7);       data.add(new Person(3, Tom, 4);       Set<Person> set = new HashSet<>();      set.addAll(data);      // new Data incoming      // could be the same Person (all 3 variables same)      // could be existing Person but with changed variables (id stays the same)      // could be completely new Person (new id)   }}期望的输出:如果新数据添加了现有的 Person 但变量不同,则 new Person(1, Max, 50); 该位置的索引应删除 Max 并添加新的 Max 50 次访问(可能在同一位置)或更好地将变量访问更改为 50。如果所有数据都相同(使用 equals() 和 hashCode() 检查):不应添加或删除任何内容如果 new Person (with new id) 不在 HashSet 中,则应该添加它这是如何实现的?我尝试使用 2 个 for 循环(这很耗时)并覆盖哈希集,但我不确定该方法。
查看完整描述

2 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

使用一个Map,而不是一个Set。


  List<Person> data = new ArrayList<>();

  data.add(new Person(1, Max, 4);

  data.add(new Person(2, Richard, 7); 

  data.add(new Person(3, Tom, 4); 


  Map<Integer, Person> map = new HashMap<>();

  data.forEach(person -> map.put(person.getId(), person));


  // new Data incoming

  // could be the same Person (all 3 variables same)

  // could be existing Person but with changed variables (id stays the same)

  // could be completely new Person (new id)

  Person newPerson = ...;

  map.put(newPerson.getId(), newPerson);

TreeMap如果你想按 ID 排序,或者LinkedHashMap你想按输入顺序排序,你可以使用。


查看完整回答
反对 回复 2023-06-04
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

不存在部分相等的情况。您的方法equals()返回truefalse。在您的情况下,您所说的平等仅由人的身份决定。也就是说,如果您添加一个具有相同 id 的人,其他任何事情都不重要,即使visits值不同,这两个 Person 实例也会被判断为相等。因此,如果您将 Person 实例存储在集合中并添加一个 id 为 1 的 Person - 如果该集合已经包含一个 id 为 1 的 Person,则旧的将被新的替换。还要记住Set没有顺序。如果您想保留订单,请使用SortedSetList。但是如果你使用List你将不得不编写代码来确保你自己不允许重复



查看完整回答
反对 回复 2023-06-04
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信