5

使用 ArrayList 我会做类似的事情

myList.set(myList.indexOf(oldItemNumber), newItemNumber);

有没有一种简单的方法可以为 LinkedHashSet 实现这一目标?

4

5 回答 5

3

只需使用put()方法。它将更新该特定条目。

于 2013-12-13T10:05:46.237 回答
3

从 LinkedHashMap 的文档中:

Map 接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。(如果在调用 m.containsKey(k) 将在调用之前立即返回 true 时调用 m.put(k, v),则将键 k 重新插入到映射 m 中。)

因此,您可以简单地将新值放入()中,它将保持其在排序中的当前位置。如果要将其添加到末尾,请删除旧值,然后添加新值。

于 2013-12-13T10:07:51.730 回答
2

这个问题对于 Set 来说毫无意义。添加到 Set 的新对象要么等于现有对象(在这种情况下什么都不会发生),要么不等于现有对象(在这种情况下它被添加到最后)。

如果不删除并重新添加所有内容,就无法在特定位置插入对象。

您可能想查看TreeSet哪个允许您保留一个有序集合,当您添加和删除对象时,该集合将由提供的比较器保持有序。

于 2013-12-13T10:15:37.147 回答
2

我解决了这个问题,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) 时,它只保留第一次出现的重复哈希码。

于 2018-06-23T19:28:28.470 回答
1

如果您将使用map.put(key ,value)相同的键,则使用它将替换以前的值

于 2013-12-13T10:06:21.927 回答