копирование Java Treemap с помощью putAll () - PullRequest
1 голос
/ 22 марта 2012

У меня есть TreeMap внутри TreeMap.

TreeMap <String, TreeMap<String, Double>> x_probs_org = new TreeMap<String, TreeMap<String, Double>>();

Но когда я делаю еще одно с точно таким же определением, а затем копирую первое:

x_probs.putAll(x_probs_org);

Я замечаюновая древовидная карта не копирует всеОн правильно копирует все ключи String, но только последний элемент в значении (TreeMap).Есть ли более простой способ сделать это правильно, кроме прокрутки всей первой карты дерева и последующего добавления элементов к новой?

Мне просто нужно иметь идентичные структуры данных с идентичными данными для начала.Я выполнил цикл, в котором заполнил первую карту дерева, а затем просто поместил следующую с ней в тот же цикл.Это также не сработало:

// build tempMap up there...
x_probs_org.put(tokens[0], tempMap);    
x_probs.put(tokens[0], tempMap);

x_probs настаивает на пропущенных данных, которые удается получить x_probs_org.Исчерпывается ли "tempMap", заполняя что-то один раз?

Ответы [ 4 ]

3 голосов
/ 22 марта 2012

Это работает для меня:

public static void main(String[] args) {
    Map <String, Map<String, Double>> map = new TreeMap<String, Map<String, Double>>();
    Map<String, Double> innerMap = new TreeMap<String, Double>();
    innerMap.put("a", 1.0);
    innerMap.put("b", 2.0);
    map.put("inner1", innerMap);
    innerMap = new TreeMap<String, Double>();
    innerMap.put("c", 3.0);
    innerMap.put("d", 4.0);
    map.put("inner2", innerMap);

    Map <String, Map<String, Double>> newMap = new TreeMap<String, Map<String, Double>>();
    newMap.putAll(map);

    System.out.println(map); // prints {inner1={a=1.0, b=2.0}, inner2={c=3.0, d=4.0}}
    System.out.println(newMap); // prints {inner1={a=1.0, b=2.0}, inner2={c=3.0, d=4.0}}
}
0 голосов
/ 22 марта 2012

Скорее всего, вы повторно используете ссылки (например, tempMap), и поэтому ваш x_probs_org также не тот, который вы ожидаете. Или вы удивляетесь, потому что вы изменяете элементы копии с помощью оригинала.

Отлично работает после:

TreeMap<String, TreeMap<String, Double>> x_probs_org = 
    new TreeMap<String, TreeMap<String, Double>>();
TreeMap<String, Double> inner = new  TreeMap<String, Double>();
inner.put("entry1", 1d);
inner.put("entry2", 2d);
x_probs_org.put("inner", inner);

TreeMap<String, TreeMap<String, Double>> x_probs = 
    new TreeMap<String, TreeMap<String, Double>>();
x_probs.putAll(x_probs_org);
0 голосов
/ 22 марта 2012

Вы можете просто использовать конструктор TreeMap(SortedMap<K,? extends V> m), например:

TreeMap <String, TreeMap<String, Double>> x_probs_org = new TreeMap<String, TreeMap<String, Double>>();

TreeMap <String, TreeMap<String, Double>> x_probs = new TreeMap<String, TreeMap<String, Double>>(x_probs_org);
0 голосов
/ 22 марта 2012

Другой простой способ, как показано ниже:

newMap = x_probs_org.clone ();

...