我有一个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循环(这会耗费执行时间)并重写哈希集,但我不确定该方法。
不存在部分相等。您的方法equals()
返回true
或false
。在你的例子中,你所说的平等只由人的身份决定。一、 e.如果您添加了一个具有相同id的人,那么其他什么都不重要,即使访问
值不同,这两个person实例也将被判断为相等。因此,如果您将Person实例存储在集合中并添加id为1的Person,那么如果集合中已经包含id为1,则旧的Person将被新的Person替换。还要记住Set
没有顺序。如果要保留订单,请使用SortedSet
或List
。但是,如果您使用<code>List</code>,则必须编写确保不允许重复的代码
使用地图
,而不是集合
。
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。否则,您将无法任意链接到页面的某些部分。 这是一个完整的示例: 在同一页面上链接内容的示例: