猿问

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

我有一个 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 循环(这很耗时)并覆盖哈希集,但我不确定该方法。


肥皂起泡泡
浏览 144回答 2
2回答

撒科打诨

使用一个Map,而不是一个Set。&nbsp; List<Person> data = new ArrayList<>();&nbsp; data.add(new Person(1, Max, 4);&nbsp; data.add(new Person(2, Richard, 7);&nbsp;&nbsp; data.add(new Person(3, Tom, 4);&nbsp;&nbsp; Map<Integer, Person> map = new HashMap<>();&nbsp; data.forEach(person -> map.put(person.getId(), person));&nbsp; // new Data incoming&nbsp; // could be the same Person (all 3 variables same)&nbsp; // could be existing Person but with changed variables (id stays the same)&nbsp; // could be completely new Person (new id)&nbsp; Person newPerson = ...;&nbsp; map.put(newPerson.getId(), newPerson);TreeMap如果你想按 ID 排序,或者LinkedHashMap你想按输入顺序排序,你可以使用。

翻过高山走不出你

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

相关分类

Java
我要回答