【问题标题】:Ordered insertion in linkedHashSet, any performant way ?在linkedHashSet中有序插入,任何高效的方式?
【发布时间】:2012-10-10 19:30:22
【问题描述】:

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

我想将 b 替换为 x ,这样 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。

【问题讨论】:

  • 既然我们遵循'final',只是想知道为什么你认为它是混乱的?

标签: java performance data-structures linkedhashset


【解决方案1】:

一种方法是使用内置替换的 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();
            }
        };
    }
}

但这意味着在填充集合之前必须知道替换。 (当然,您可以轻松地将这个 &lt;String&gt; 版本转换为通用版本。


回应cmets:

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

【讨论】:

  • 正如你所提到的,这就是问题所在!我们不知道什么会被替换,什么时候会被替换。
【解决方案2】:
  1. 创建结构图
  2. 用 插入所有字符串
  3. 通过在当前字符串的 OrderOfTheString 之后添加一个小的 Delta 来插入新字符串。
  4. 将 Map 转换为 LikedHashSet

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

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2013-07-25
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多