2012-03-22 6 views
1

У меня есть TreeMap внутри TreeMap.копирование java treemap treemap с помощью putAll()

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

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

x_probs.putAll(x_probs_org); 

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

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

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

x_probs настаивает на том, что отсутствуют данные x_probs_org удается получить. «TempMap» истощается, когда-то заполняется?

ответ

3

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

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

Еще один простой способ, как следующее:

newMap = x_probs_org.clone();

0

Вы можете просто использовать 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

Скорее всего, вы повторно ссылки (например, 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); 
Смежные вопросы