1

だから私はLinkedHashSetを持っており、値はa1、a2、、b、c1、c2と言っています

xの順序がbの順序と同じになるように、bをxに置き換えたいと思います。

1つの明白な方法は

 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

これを行う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をそのままにして、値を取得するときにイテレータを装飾することもできます。

于 2012-10-10T19:45:40.033 に答える
0
  1. 構造マップを作成する
  2. <String、OrderOfTheString>を使用してすべての文字列を挿入します
  3. 現在の文字列のOrderOfTheStringの後に小さなデルタを追加して、新しい文字列を挿入します。
  4. マップをLikedHashSetに変換する

複雑なことはわかっていますが、約1000000要素のハッシュマップをリンクしていて、挿入する要素が約1000ある場合は、間違いなく優れています。

于 2013-01-17T01:27:06.903 に答える