在linkedHashSet中有序插入,任何高效的方式?

时间:2012-10-10 19:30:23

标签: java performance data-structures linkedhashset

所以我有一个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。

2 个答案:

答案 0 :(得分: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不变,并在检索值时修饰迭代器。

答案 1 :(得分:0)

  1. 创建结构地图
  2. 使用&lt;插入所有字符串String,OrderOfTheString&gt;
  3. 通过在当前字符串的OrderOfTheString之后添加一个小Delta来插入新的String。
  4. 将地图转换为LikedHashSet
  5. 我知道它很复杂,但是当我们链接~1000000元素的哈希Map并且大约有1000个要插入的元素时,它肯定会更好。