当前位置: 首页 > 知识库问答 >
问题:

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

钱欣悦
2023-03-14

我有一个ArrayList<code>data</code>,其中包含<code>Person</code>类型的Objects,它每n秒更新一次,并具有现有数据的总量。为了在表中显示这些数据,我使用<code>clear()</code>一个ObservableList,并使用<code>addAll(data)</ccode>来避免GUI阻塞。

我想使用HashSet作为Observable Collection,我想知道如果HashSet仅部分相等,是否有有效的方法从HashSet更新Object。

代码:

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() 检查):不应添加或删除任何内容

如果新的人(有新的id)不在HashSet中,它应该被添加

这是如何实现的?我尝试了使用2for循环(这会耗费执行时间)并重写哈希集,但我不确定该方法。

共有2个答案

白灿
2023-03-14

不存在部分相等。您的方法equals()返回truefalse。在你的例子中,你所说的平等只由人的身份决定。一、 e.如果您添加了一个具有相同id的人,那么其他什么都不重要,即使访问值不同,这两个person实例也将被判断为相等。因此,如果您将Person实例存储在集合中并添加id为1的Person,那么如果集合中已经包含id为1,则旧的Person将被新的Person替换。还要记住Set没有顺序。如果要保留订单,请使用SortedSetList。但是,如果您使用<code>List</code>,则必须编写确保不允许重复的代码

李洋
2023-03-14

使用地图,而不是集合

  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);

如果您想按ID排序,可以使用TreeMap,如果您想按条目顺序排序,可以使用LinkedHashMap

 类似资料:
  • 问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一

  • 问题内容: 我明白为什么为两个相等的(通过)对象提供相同的哈希码很重要。但是反之亦然,如果两个对象具有相同的哈希码,它们必须相等吗?合同还存在吗?我找不到一个可能发生这种情况的示例,因为如果所有使用equals方法的属性都被用来覆盖hashcode方法,那么我们将始终对相等的对象使用相同的hashcode。请评论。 问题答案: 如果两个对象相同,则它们不一定相等。否则,您将发现完美的哈希函数。 但

  • 所以,我有一个带有数组的哈希,就像这样: 我想将它们合并到一个哈希数组中,组合相应的元素。 结果应该是这样的: 知道如何有效地做到这一点吗? 请注意,真实世界的使用场景可能包含数量可变的散列键。

  • 常见问题,Int Raku,如何合并,合并两个哈希? 说: 如何获取

  • 我有两个哈希要合并。它们看起来像这样: 第二个散列看起来像: 我想合并这两个散列数组,结果如下所示: 有没有一种简单的方法来合并这两个哈希,或者我必须逐个遍历哈希并在另一个哈希中找到该键?

  • 问题内容: 您如何链接(与),以便浏览器转到目标页面上与顶部相对的某些子标题? 问题答案: 如果有标签或任何带有(例如>)的标签,则只需将其附加到URL。否则,您将无法任意链接到页面的某些部分。 这是一个完整的示例: 在同一页面上链接内容的示例: