2012-11-20 49 views
-1

我正在努力解決這個哈希表問題(Java新手)。該程序接收事件ADD_info的實例,然後運行「public ADD_info()」方法。對於每一個我希望將一個鍵/值對寫入散列表的實例(鍵:TASK.value,值:INFO_add.value - 兩個變量都用ADD_info事件外部填充)。我可以添加一個條目,但是當我輸入第二個條目時,第一個條目的值條目會被覆蓋。下面給出簡化的代碼和程序輸出。新的哈希表條目覆蓋另一個鍵的值 - Java

TASK.value = "TASK1" 
INFO_add_0:"1" 
INFO_add_1:"2" 
INFO_add_2:"3" 
INFO_add_3:"4" 
INFO_add_4:"5" 

/** HASHTABLE ENTRIES */ 
No. of Keys = 1 
TASK1 
info_0: "1" 
info_1: "2" 
info_2: "3" 
info_3: "4" 
info_4: "5" 

然後,對於第二個實例:

TASK.value = "TASK2" 
INFO_add_0:"11" 
INFO_add_1:"22" 
INFO_add_2:"33" 
INFO_add_3:"44" 
INFO_add_4:"55" 

/** HASHTABLE ENTRIES */ 
No. of Keys = 2 
TASK1 
info_0: "11" 
info_1: "22" 
info_2: "33" 
info_3: "44" 
info_4: "55" 
TASK2 
info_0: "11" 
info_1: "22" 
info_2: "33" 
info_3: "44" 
info_4: "55" 

其示出的值

public class ProdInfo_SIFB extends fb.rt.FBInstance { 
    /** EVENT ADD_info */ 
    public final EventInput ADD_info = new EventInput(this); 

    /** EVENT ADDED */ 
    public final EventOutput ADDED = new EventOutput(); 

    /** VAR TASK:WSTRING */ 
    public WSTRING TASK = new WSTRING(); 

    /** VAR INFO_add:WSTRING */ 
    public ARRAY INFO_add = new ARRAY(new WSTRING(), 5);; 

    Hashtable Product_info = new Hashtable(); //instantiate hashtable 

    public ProdInfo_SIFB(){ 
     super(); 
    } 
    public void serviceEvent(EventServer e){ 

     if (e == ADD_info) service_ADD_info(); 
    } 

    /** Services the ADD_info event. */ 
    public void service_ADD_info(){ 

     System.out.println("TASK.value = " + TASK.value); //display TASK.value content 
     //display entries of INFO_add array as received from external source 
     for(int j = 0; j < INFO_add.value.length; j++){ 
      System.out.println("INFO_add_" + j + ":" + INFO_add.value[j].toString()); 
     } 

     Product_info.put(TASK.value, INFO_add.value); //add key and value to hashtable 

     System.out.println("No. of Keys = " + Product_info.size()); 

     // Display all elements in hash table. 
     Enumeration tasks = Product_info.keys(); 
     while(tasks.hasMoreElements()) { 
      String str = (String) tasks.nextElement(); 
      ANY[] info = (ANY[]) Product_info.get(str); 
      System.out.println(str + ": "); 
      for(int i = 0; i < info.length; i++){ 
       System.out.println("info_" + i + ": " + info[i].toString()); 
      } 
     } 

     ADDED.serviceEvent(this); 
    } 
} 

第一個實例如下所述INFO_add陣列的條目和哈希表的外觀第一個密鑰TASK1被覆蓋。

任何幫助將不勝感激!此外,請原諒一些命名約定 - 其中一些是由FBDK自動生成的。

問候 卡雷爾

+2

你可以提供一個[簡短的,獨立的,正確的例子](http://sscce.org),重點討論主要問題(在這種情況下向哈希表添加值) – Edd

+2

可能最好閱讀[HashTable文檔](http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html),你的'HashTable '按預期工作,但你想要像'HashTable >'或MultiMap – jlordo

+0

是的,操作員故障。 –

回答

3

我想你重用你每次插入新的鍵/值對相同時間INFO_add情況下,你真的需要做的是創造new ARRAY(new WSTRING(), 5);新實例每次啓動與下一個記錄工作時間組。

我不知道你在哪裏填寫數據INFO_add但你可以重新初始化它,你把它變成產品的詳細信息剛過:

Product_info.put(TASK.value, INFO_add.value); //add key and value to hashtable 
INFO_add = new ARRAY(new WSTRING(), 5); // add this line 
+0

INFO_add數組實際上是我正在使用的服務接口功能塊的輸入數據變量。 FBDK實際上自動生成了大部分代碼。所以每當發生ADD_info事件時,INFO_array的數據都會被更新。我現在嘗試重新初始化 - 它仍錯誤地更新了TASK1的值,現在將TASK2的值設置爲空(空)。你能解釋爲什麼TASK1的價值被錯誤地更新嗎?我感謝幫助! – Karel

+0

如果您希望TASK1和TASK2的值不同且獨立,則不能重複使用同一對象。 –

+0

然後我建議將INFO_array中的值複製到一個新數組中,然後將該數組放入散列表中。 – hoaz

2

檢查是否已添加到地圖鍵「TASK1」的對象是在放入地圖後進行修改。我敢打賭,這樣的事情正在發生。

MyObject obj = new MyObject(); 
obj.setValue("1","2",3"); 
map.put("TASK1", obj); 
obj.setValue("11","22",33"); 
map.put("TASK2", obj); 

將一個對象放在地圖上不會生成它的副本,所以你最終得到兩個指向相同值的地圖條目。

+0

如果我理解正確,提供的代碼是目前在程序中發生的事情......?如果是這樣,我該如何解決它(即不覆蓋值條目)? – Karel

相關問題