使用ArrayList,我会做类似
的事情myList.set(myList.indexOf(oldItemNumber), newItemNumber);
有没有一种简单的方法来实现LinkedHashSet?
答案 0 :(得分:2)
只需使用put()
方法即可。它将更新该特定条目。
答案 1 :(得分:2)
来自LinkedHashMap的文档:
使用Hash表和Map接口的链表实现 可预测的迭代顺序。此实现与HashMap不同 因为它维护着一个贯穿所有链接的双向链表 条目。该链表定义了迭代排序,即 通常是键插入地图的顺序 (插入顺序)。请注意,如果键是插入顺序不受影响 被重新插入地图。 (如果将密钥k重新插入到地图m中 当m.containsKey(k)返回true时,调用m.put(k,v) 在调用之前。)
所以你可以简单地把()放入()新的值,它将保持它在订购中的当前位置。如果要将其添加到最后,请删除旧值,然后添加新值。
答案 2 :(得分:2)
这个问题对于一个集合来说毫无意义。添加到Set的新对象要么等于现有对象(在这种情况下没有任何反应),要么没有(在这种情况下,它会在末尾添加)。
如果不删除并重新添加所有内容,则无法在特定位置插入对象。
您可能需要查看TreeSet
,它允许您保留一个有序集,在添加和删除对象时,所提供的比较器将保持有序集。
答案 3 :(得分:1)
使用map.put(key ,value)
如果您将使用相同的密钥,它将替换之前的值
答案 4 :(得分:1)
我解决了此问题,其中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)时,它仅保留第一次出现的任何重复哈希码。