-1

私はこのハッシュテーブルの問題に苦労しています(Javaの新機能)。プログラムは、イベントADD_infoのインスタンスを受け取り、「public ADD_info()」メソッドを実行します。すべてのインスタンスについて、キーと値のペアをハッシュテーブルに書き込みます(キー:TASK.value、値:INFO_add.value-両方の変数は外部でADD_infoイベントで埋められます)。1つのエントリを追加できますが、2つ目のエントリを入力すると、最初のエントリの値エントリが上書きされます。簡略化されたコードは、プログラム出力とともに以下に示されています。

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配列とハッシュテーブルのエントリは、最初のインスタンスでは次のようになります。

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"

次に、2番目のインスタンスの場合:

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"

これは、上書きされている最初のキーTASK1の値を示しています。

どんな助けでも大歓迎です!また、命名規則のいくつかを許してください-それのいくつかはFBDKによって自動的に生成されました。

よろしくカレル

4

2 に答える 2

3

新しいキーと値のペアを挿入するたびに同じ INFO_add インスタンスを再利用すると思いますが、実際に必要なのはnew ARRAY(new WSTRING(), 5);、次のレコード セットで作業を開始するたびに新しいインスタンスを作成することです。

INFO_add のデータをどこに入力するのかわかりませんが、Product_info に入れた直後に再初期化できます。

Product_info.put(TASK.value, INFO_add.value);  //add key and value to hashtable
INFO_add = new ARRAY(new WSTRING(), 5); // add this line
于 2012-11-20T20:48:49.367 に答える
2

キー「TASK1」でマップに追加したオブジェクトが、マップに配置された後に変更されていないか確認してください。私はこのようなことが起こっているに違いない。

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

オブジェクトをマップに配置してもそのコピーは作成されないため、2つのマップエントリが両方とも同じ値を指すことになります。

于 2012-11-20T20:50:06.793 に答える