将一对放在LinkedHashMap中的特定位置

时间:2014-07-28 09:54:23

标签: java collections

我想要一个HashMap,其中按照我添加的方式订购密钥。

所以我使用的是LinkedHashMap。它有一个可预测的迭代顺序。

如果您使用put,则插入的密钥将位于地图密钥集的末尾。

是否可以使用put,将键/对象插入特定位置?例如,我希望put索引2处的某些东西,有效地使这对在迭代时成为第三个条目。

4 个答案:

答案 0 :(得分:11)

您可以使用ListOrderedMap中的Apache Commons Collections

它有put(int index, K key, V value)方法,可以完全按照您的意愿执行。

答案 1 :(得分:4)

现有的集合都不支持。 TreeMap可以根据键保持元素排序,但是如果你想要任意顺序,那么唯一可行的方法就是从地图中删除该点之后的所有内容,然后将它们添加回来试。

您可以通过扩展HashMap并使用您自己的List作为迭代顺序来模拟您需要的行为。然后,您可以公开在List内移动元素的方法。您需要小心保持MapList同步(如在一致数据中,而不是在线程中)。

答案 2 :(得分:4)

这是一个使用临时映射在适当的索引处理中插入特定索引处的项目的简单方法。

您也可以将其设为 Generic

public static void put(LinkedHashMap<String, String> input, 
                                 int index, String key, String value) {

    if (index >= 0 && index <= input.size()) {
        LinkedHashMap<String, String> output=new LinkedHashMap<String, String>();
        int i = 0;
        if (index == 0) {
            output.put(key, value);
            output.putAll(input);
        } else {
            for (Map.Entry<String, String> entry : input.entrySet()) {
                if (i == index) {
                    output.put(key, value);
                }
                output.put(entry.getKey(), entry.getValue());
                i++;
            }
        }
        if (index == input.size()) {
            output.put(key, value);
        }
        input.clear();
        input.putAll(output);
        output.clear();
        output = null;
    } else {
        throw new IndexOutOfBoundsException("index " + index
                + " must be equal or greater than zero and less than size of the map");
    }
}

答案 3 :(得分:0)

可以在以下链接中找到@Braj的通用版本 实施细节略有不同,但没有问题。

https://stackoverflow.com/a/21054277/361100

以下代码与上述链接相同,但我反映了squarefrog的评论。

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