2015-06-04 3 views
0

У меня есть отладки выходов в конструктор, который все выходные данные, как и ожидалосьпотери данных из класса во для каждой итерации

Входящий Параметр {C = 0,620405, Н = 0,104122, O = 0,275473} Сохраненный

Параметр {C = 0,620405, H = 0,104122, O = 0,275473}

Но когда я называю ToString() в то время как переборе списка он возвращает пустой набор.

В чем причина этого поведения?

public class PNNLEntry { 
      private String matNum = ""; 
      private String material = ""; 
      private String formula = ""; 
      private String density = ""; 
      private String comment = ""; 
      private String references = ""; 
      //Map element to weight fraction as string 
      private Map<String, String> elements = new TreeMap<String, String>(); 

     public PNNLEntry(){ 

     } 
     public PNNLEntry(String num, String mat, String form, String dens, 
       String com, String ref, Map<String, String> elem){ 
      matNum = num; 
      material = mat; 
      formula = form; 
      density = dens; 
      comment = com; 
      references = ref; 
      elements = elem; 
      System.out.println("Incoming Parameter" + elem.toString()); 
      System.out.println("Stored Parameter" + elements.toString()); 
      System.out.println(this.toString()); 
     } 

@Override 
public String toString(){ 
    String buff = "\n"; 

    buff += matNum; 
    buff += ") " + material; 
    buff += "\t" + formula; 
    buff += "\n" + density; 
    buff += "\n" + comment; 
    buff += "\n" + elements.toString(); 

    buff += "\n" + references; 

    return buff; 
} 
} 

Из структур:

private static PNNLEntry entry = new PNNLEntry(); 
private static List<PNNLEntry> outlist = new ArrayList<PNNLEntry>(); 

Пример вывода кода

System.out.println("ELEMENTS \t " + elements.toString()); 
entry = new PNNLEntry(matNum, material, formula, density, 
         comment, references, elements); 
System.out.println(entry.toString()); 
outlist.add(entry); 
//clear map for next element 
elements.clear(); 

... 

for(PNNLEntry output : outlist){ 
    System.out.println(output); 
    System.out.println(output.getElements().toString()); 
} 

Выходы:

элементов {C = 0,775501, Ca = 0,018378, F = 0,017422, H = 0,101327, N = 0,035057, O = 0,052316} Входящий параметр ter {C = 0,775501, Ca = 0,0175378, F = 0,017422, H = 0,101327, N = 0,035057, O = 0,052316} Хранилище Параметр {C = 0,775501, Ca = 0,018378, F = 0,017422, H = 0,101327, N = 0,035057 , O = 0,052316}

1) А-150 Ткань-эквивалентная пластическая (A150TEP) - 1,127000 выше плотность, по оценкам, с точностью до 4 значащих цифр. Неопределенности не рассматриваются. Следующие данные были рассчитаны из входных весов фракций {C = 0,775501, Са = 0.018378, F = 0,017422, H = 0,101327, N = 0.035057, O = 0,052316} Плотность и весовые фракции от http://physics.nist.gov/cgi-bin/Star/compos.pl?matno=099 (NIST 1998).

...

1) А-150 Ткань-эквивалентная пластическая (A150TEP) -
1,127000 выше плотность, по оценкам, с точностью до 4 значащих цифр. Неопределенности не рассматриваются. Следующие данные были рассчитаны из входных весовых фракций {} Плотность и весовые доли от http://physics.nist.gov/cgi-bin/Star/compos.pl?matno=099 (NIST 1998).

Таким образом, единственными потерянными данными являются данные карты, которые были переданы.

Мое лучшее предположение в настоящее время - проблема сглаживания при очистке карты после ее передачи конструктору класса, но я не уверен, что это так или как ее лучше разрешить.

ответ

1

Вот проблема:

elements.clear(); 

Напомним, что внутри вашего конструктора, вы делаете это:

elements = elem; 

... где elements представляет ваше поле и elem представляет собой то, что вы прошли. Это означает, что они указывают на ту же ссылку.

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

  • Новые вверх экземпляр карты, когда вы пытаетесь вставить вещи ...
  • ... или использовать HashMap «s copy constructor:

    elements = new HashMap<>(elem); 
    
+0

Это то, чего я ожидал, был виновником, но получение этого подробного ответа действительно дает мне понимание происходящего. Однако сброс состояния карты необходим, поскольку цикл заполняет карту, которая передается объекту. Существует 300 таких карт, которые генерируются и передаются, поэтому вопрос о ссылке очень важен для ознакомления. Большое спасибо. –

-1

Похоже, что эта строка в вашем примере кода вывода очищает элементы, прежде чем вы попадете в цикл for ...

elements.clear(); 
+0

Причина для нисходящего потока? –

Смежные вопросы