web-dev-qa-db-ja.com

LinkedHashMapの特定のインデックス/位置に要素を追加する方法は?

順序付けされたLinkedHashMapがあり、マップの最初の場所や最後の場所など、特定のインデックスに要素を追加したい。 LinkedHashMapの特定の位置に要素を追加するにはどうすればよいですか?

LinkedHashMapの最初または最後の位置に要素を追加できたとしても役立ちます!

43
supernova

順序を変更することはできません。このコンストラクターでは、_insert-order_(デフォルト)または_access-order_です。

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

  • 指定された初期容量、負荷係数、順序モードで空のLinkedHashMapインスタンスを構築します。

  • パラメータ:initialCapacity-初期容量loadFactor-負荷係数accessOrder-順序モード-アクセス順序の場合はtrue、挿入順序の場合はfalse

  • 例外:IllegalArgumentException-初期容量が負の場合、または負荷係数が正でない場合

参照: LinkedHashMap

20
MasterCassim

あなたはこの要素を1に追加するか、最後の場所にすることができます:

最後の場所に追加►次のようにマップから前のエントリを削除するだけです。

map.remove(key);
map.put(key,value);

最初の場所に追加►もう少し複雑です。次のように、マップのクローンを作成し、クリアして、値を1に入れ、新しいマップを配置する必要があります。

文字列キーとグループ(私のカスタムクラス)値を持つマップを使用しています。

LinkedHashMap<String, Group> newmap=(LinkedHashMap<String, Group>) map.clone();
map.clear();
map.put(key, value);
map.putAll(newm);

ご覧のとおり、これらのメソッドを使用すると、マップの最初と最後に無制限の量を追加できます。

21
gyurix
public static <K, V> void add(LinkedHashMap<K, V> map, int index, K key, V value) {
  assert (map != null);
  assert !map.containsKey(key);
  assert (index >= 0) && (index < map.size());

  int i = 0;
  List<Entry<K, V>> rest = new ArrayList<Entry<K, V>>();
  for (Entry<K, V> entry : map.entrySet()) {
    if (i++ >= index) {
      rest.add(entry);
    }
  }
  map.put(key, value);
  for (int j = 0; j < rest.size(); j++) {
    Entry<K, V> entry = rest.get(j);
    map.remove(entry.getKey());
    map.put(entry.getKey(), entry.getValue());
  }
}
7
tamalet

LinkedHashMapを2つの配列に分割するだけです。最初の配列をサイズindex - 1で作成し、最後に新しいEntryを配置します。次に、最初の配列を2番目の配列のエントリで埋めます

6
rock_walker
...

LinkedHashMap<String, StringExtension> map = new LinkedHashMap<>();

map.put("4", new StringExtension("4", "a"));
map.put("1", new StringExtension("1", "b"));
map.put("3", new StringExtension("3", "c"));
map.put("2", new StringExtension("2", "d"));

for (Map.Entry<String, StringExtension> entry : map.entrySet()) {
    Log.e("Test", "" + entry.getKey() + " - "+ entry.getValue().value);
}


Collection<StringExtension> temp = new ArrayList<>(map.values());
StringExtension value = map.remove("3");
map.clear();
map.put(value.key, value);

for (StringExtension val : temp) {
    map.put(val.key, val);
}

Log.e("Test", "---");

for (Map.Entry<String, StringExtension> entry : map.entrySet()) {
    Log.e("Test", "" + entry.getKey() + " - "+ entry.getValue().value);
}

...

private class StringExtension
{
    String key;
    String value;

    public StringExtension(String key, String value) {
        this.key = key;
        this.value = value;
    }
}
1
Nauman Aejaz

Mapであり、インデックスはありません。バケットがあります。動作する方法は、

put(key, val)

キーをハッシュして、valを入れるバケットを見つけます。

LinkedHashMapは二重にリンクされたリストを保持するため、エントリが挿入された(またはマップのインスタンス化方法に応じてアクセスされた)順序を記録できます。 MapのAPIには、リンクリストの特定のインデックスにkey、valペアを挿入する方法がありません。これは、それがサービスを提供する目的ではないためです。

1
hvgotcodes