2012-11-20 26 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

相关问题