1

私がやろうとしていることは非常に簡単です.2つのマップをマージしたい. 言う

map1={(1,"one"),(2,"two"),(3,"three");
map2={(1,"onetoo"),(4,"four")};

これに従えば->

map3.putall(map1);
map3.putall(map2);

1の値はonetooですが、逆をたどると1になります。とにかく私はそれを変更できますか?私が意味するのは、Javaがキーの最新の値のみを上書きして配置するということです。つまり、onetoo が (それぞれのマップで) 1 つ後に追加された場合、map3 への putall 呼び出しの順序に関係なく、値は onetoo のままです。

4

3 に答える 3

7

値が追加された実際の時間を保存しない限り、それを行う方法はありません。

言うmap1={(1,("one", 15:15)), (2, ("two", 15:16))}

次に、すべての map1 を追加してから、map2 を反復処理して、キーがまだ存在しない場合、または存在するが以前のタイムスタンプがある場合にのみ追加します。

于 2012-06-13T07:55:53.853 に答える
1

これがマップの仕組みです。マップは、マップエントリ内で自分自身を識別する方法として、キーとして設定したオブジェクトのハッシュコードを使用します。ご覧のとおり、マップは一意である必要があります。

したがって、整数値1のハッシュコードは1であるため、別のキーを指定する必要があります。

于 2012-06-13T07:58:34.197 に答える
0

プログラムが希望どおりに機能した場合は、次の出力を予測します。

 map3.get(1);

それが「One」なのか「Onetoo」なのかわからない。

このような問題を防ぐには、Javaのマップは一意のキーのみを含むように設計されています。

だから、あなたが書くなら

map3.putall(map1);

1の値は「1」です。しかし、あなたが書くとすぐに

map3.putall(map2);

1の値がリセットされ、「onetoo」になります。逆にすると逆になります。考えられる解決策は次のとおりです。

  1. キー(キー)がオブジェクトを一意に識別するように、キーをマップに配置します。そのため、将来マップをマージするときはいつでも、キーで(重複に関して)衝突が発生しません。

  2. それができない場合、考えられる解決策は、すべてのマップのすべてのキーを取得して重複をチェックし、面倒なことなくオブジェクトを取得できるように重複キーを変更することです。

于 2012-06-13T10:04:05.440 に答える