3

ConcurrentHashMap を使用しているレガシー アプリケーションがあります。現在、concurrentHasMap は順不同ですが、最初に挿入されたとおりにオブジェクトを読み取る必要があります。私が持っているコードは、本番環境でしばらく使用されているため、コレクションを置き換えるだけの簡単な代替手段を探しています。これにより、注文も可能になります。基本的に、最小限のコード変更につながる非常に非侵襲的なソリューションを探しています。私は Web を検索し、代わりに ConcurrentSkipListMap を入手しましたが、うまくいきません。理由は、デフォルトではキーの自然な順序で注文するため、これはうまくいきません。私のキーは文字列であるため、文字列キーがマップ内で自然に順序付けられる方法ではなく、挿入に基づいて順序付けする必要があります。

できるだけ早くいくつかの代替案を提案してください。

ありがとうアヌバフ

4

2 に答える 2

0

キーを自分で再注文できます。このようなことが可能かもしれません。これは完全な解決策ではないことに注意してください。適切に実装するには、さらに多くの作業が必要になりますConcurrentMap

class InsertOrderedMap<K, V> implements ConcurrentMap<K,V> {
  // The actual map holding the data.
  Map<Integer, V> ordered = new ConcurrentSkipListMap<>();
  // Mapping the key to the order.
  Map<K, Integer> reorder = new ConcurrentSkipListMap<>();
  // The next position.
  AtomicInteger next = new AtomicInteger(0);

  @Override
  public V get(Object o) {
    return ordered.get(reorder.get(o));
  }

}

同じキーに 2 回追加する場合は、どうする必要があるかを判断する必要があります。元の位置と新しい位置のどちらの位置に値を配置する必要がありますか? 元のものは削除する必要がありますか?

于 2013-05-30T14:09:31.293 に答える