【发布时间】:2013-12-13 10:03:56
【问题描述】:
使用 ArrayList 我会做类似的事情
myList.set(myList.indexOf(oldItemNumber), newItemNumber);
有没有一种简单的方法可以为 LinkedHashSet 实现这一目标?
【问题讨论】:
标签: java linkedhashset
使用 ArrayList 我会做类似的事情
myList.set(myList.indexOf(oldItemNumber), newItemNumber);
有没有一种简单的方法可以为 LinkedHashSet 实现这一目标?
【问题讨论】:
标签: java linkedhashset
只需使用put() 方法。它将更新该特定条目。
【讨论】:
来自 LinkedHashMap 的文档:
Map接口的哈希表和链表实现,带有 可预测的迭代顺序。此实现不同于 HashMap 因为它维护一个双向链表,贯穿其所有 条目。这个链表定义了迭代顺序,即 通常是键插入地图的顺序 (插入顺序)。请注意,如果键不影响插入顺序 被重新插入到地图中。 (如果键 k 被重新插入到映射 m 中,则 当 m.containsKey(k) 返回 true 时调用 m.put(k, v) 在调用之前。)
所以你可以简单地 put() 新值,它会在排序中保持它的当前位置。如果要将其添加到末尾,请删除旧值,然后添加新值。
【讨论】:
这个问题对于 Set 来说毫无意义。添加到 Set 中的新对象要么等于现有对象(在这种情况下什么都不会发生),要么不等于现有对象(在这种情况下它被添加到末尾)。
如果不删除并重新添加所有内容,就无法在特定位置插入对象。
您可能想查看TreeSet,它允许您保留一个有序集合,当您添加和删除对象时,该集合将由提供的比较器保持有序。
【讨论】:
我解决了这个问题,LinkedHashSet 成员对象有一个哈希码,它只计算对象的一部分(例如其名称字段)的值。是的,这是非常规的,但我也有一个匹配的 equals() 方法。两个不同的对象可以具有相同的哈希码并且看起来相等,但在内部它们具有一些不同的值。
一个例子是一个数据库记录,它的键必须是唯一的。您需要将记录替换为一组新的值,因此您需要使用匹配键查找记录并将其替换为新值。
// Rebuild Linked Hash Set in original order with new element.
ArrayList<Item> newSet = new ArrayList<>(oldSet);
newSet.add(newSet.indexOf(oldItem), newItem);
oldSet.clear();
oldSet.addAll(newSet);
arrayList 将具有相同顺序的旧值,新项目将添加到旧项目之前。无需删除重复项。当添加到旧的 HashSet (LinkedHashSet) 时,它只保留第一次出现的重复哈希码。
【讨论】:
使用map.put(key ,value),如果你将使用相同的键,它将替换以前的值
【讨论】:
Set 不允许重复值,不排序也不索引,所以我们不能在索引上替换