【问题标题】:How to replace a specific element in a LinkedHashSet?如何替换 LinkedHashSet 中的特定元素?
【发布时间】:2013-12-13 10:03:56
【问题描述】:

使用 ArrayList 我会做类似的事情

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

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

【问题讨论】:

标签: java linkedhashset


【解决方案1】:

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

【讨论】:

  • 对不起,我的意思是 LinkedHashSet 而不是 LinkedHashMap =/
  • @GedankenNebel 然后同样的逻辑适用。使用 add() 方法。
  • add() 方法只是将一个元素添加到我的集合中。我想替换 LinkedHashSet 中的特定元素。
【解决方案2】:

来自 LinkedHashMap 的文档:

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

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

【讨论】:

  • 对不起,我的意思是 LinkedHashSet 而不是 LinkedHashMap =/
【解决方案3】:

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

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

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

【讨论】:

  • 我认为 TreeSet 会是一个更好的选择。谢谢!
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 对不起,我的意思是 LinkedHashSet 而不是 LinkedHashMap =/
    • @GedankenNebel Set 不允许重复值,不排序也不索引,所以我们不能在索引上替换
    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 2018-05-06
    • 2015-12-29
    • 2021-10-16
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多