繁体   English   中英

如何替换LinkedHashSet中的特定元素?

[英]How to replace a specific element in a LinkedHashSet?

使用ArrayList我会做类似的事情

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

有没有一种简单的方法来实现LinkedHashSet?

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

从LinkedHashMap的文档:

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

因此,您可以简单地将()放入新值,并将其保留在订购中的当前位置。 如果要将其添加到最后,请删除旧值,然后添加新值。

这个问题对于一个集合来说毫无意义。 添加到Set的新对象要么等于现有对象(在这种情况下没有任何反应),要么不会(在这种情况下,它会在末尾添加)。

在不删除和重新添加所有内容的情况下,无法在特定位置插入对象。

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

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

我解决了这个问题,其中一个LinkedHashSet成员对象有一个哈希码,它只计算一部分对象的值(从它的Name字段开始)。 是的,这是非常规的,但我也有一个匹配的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)时,它只保留第一次出现的任何重复哈希码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM