1

所以我有一个 LinkedHashSet ,其值为 a1, a2, , b, c1, c2

我想用 x 替换 b ,这样 x 的顺序应该与 b 的顺序相同。

一种明显的方法是

 private LinkedHashSet<String> orderedSubstitution(final Set<String> originalOrderedSet, final String oldItem,
            final String newItem) {
        final LinkedHashSet<String> newOrderedSet = new LinkedHashSet<String>();
        // Things we do to maintain order in a linkedHashSet
        for (final String stringItem : originalOrderedSet) {
            if (stringItem.equals(oldItem)) {
                newOrderedSet.add(newItem);
            } else {
                newOrderedSet.add(stringItem);
            }
        }
        return newOrderedSet;
    }

这不仅是 O(n) 我也觉得这不是最快的方法。有更好的解决方案吗?注意:我必须使用linkedHashMap。

4

2 回答 2

0

一种方法是使用内置替换的 LinkedHashSet 的子类,例如:

public class ReplacingLinkedHashSet extends LinkedHashSet<String> {
    private final String what;
    private final String with;

    public ReplacingLinkedHashSet(String what, String with) {
        this.what = what;
        this.with = with;
    }

    @Override
    public Iterator<String> iterator() {
        final Iterator<String> iterator = super.iterator();
        return new Iterator<String>() {
            @Override
            public boolean hasNext() {
                return iterator.hasNext();
            }

            @Override
            public String next() {
                String next = iterator.next();
                return what.equals(next) ? with : next;
            }

            @Override
            public void remove() {
                iterator.remove();
            }
        };
    }
}

但这意味着在填充 Set 之前必须知道替换。(当然你可以很容易地把这个<String>版本变成一个通用版本。


回复评论:

好的,那么没有完整的迭代就没有办法解决它。但是,您可以在检索值时保持 LinkedHashSet 不变并装饰迭代器。

于 2012-10-10T19:45:40.033 回答
0
  1. 创建结构图
  2. 用 <String, OrderOfTheString> 插入所有字符串
  3. 通过在当前字符串的 OrderOfTheString 之后添加一个小的 Delta 来插入新字符串。
  4. 将 Map 转换为 LikedHashSet

我知道这很复杂,但是当我们链接约 1000000 个元素的哈希映射并且要插入大约 1000 个元素时,它肯定会更好。

于 2013-01-17T01:27:06.903 回答