使用 ArrayList 我会做类似的事情
myList.set(myList.indexOf(oldItemNumber), newItemNumber);
有没有一种简单的方法可以为 LinkedHashSet 实现这一目标?
使用 ArrayList 我会做类似的事情
myList.set(myList.indexOf(oldItemNumber), newItemNumber);
有没有一种简单的方法可以为 LinkedHashSet 实现这一目标?
只需使用put()
方法。它将更新该特定条目。
从 LinkedHashMap 的文档中:
Map 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。(如果在调用 m.containsKey(k) 将在调用之前立即返回 true 时调用 m.put(k, v),则将键 k 重新插入到映射 m 中。)
因此,您可以简单地将新值放入()中,它将保持其在排序中的当前位置。如果要将其添加到末尾,请删除旧值,然后添加新值。
这个问题对于 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)
相同的键,则使用它将替换以前的值