有序插入linkedHashSet,任何性能方法?(Ordered insertion in lin

2019-08-01 08:33发布

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

Answer 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();
            }
        };
    }
}

但是,这意味着更换就必须知道您填写的集之前。 (当然,你可以很容易地把这个<String>版本到一个通用的一个。


回复评论:

OK,那么有没有办法解决它没有一个完整的迭代。 你可以不过才离开LinkedHashSet不变和检索值时,装饰迭代器。



Answer 2:

  1. 创建一个结构地图
  2. 插入所有字符串<字符串,OrderOfTheString>
  3. 当前字符串的OrderOfTheString后加入小的增量执行新的String的插入。
  4. 转换地图到LikedHashSet

我知道这是复杂的,但它是肯定更好,当我们链接的哈希地图〜百万元的和有大约1000个元素插入。



文章来源: Ordered insertion in linkedHashSet, any performant way ?