2

いくつかのキーのみに基づいて (すべてではない)、2 つの HashMap が等しいかどうかを判断する必要があります。

各フィールドに個別にアクセスして等しいかどうかを比較する以外に、これを行うための時間効率の良い方法はありますか?

4

4 に答える 4

1

私が考えることができる1つの方法は、新しいアイテムが追加されたり、既存のアイテムが変更/削除されるたびに更新されるHashMapに、ある種の「圧縮ラベル」を保存することです。比較する必要があるときはいつでも、この「圧縮されたラベル」を比較するだけです。

この「圧縮ラベル」に使用するアルゴリズムの種類がわかりません。すべての HashMap アイテムを文字列に変換できる場合は、文字列のすべての連結を MD5 ハッシュしてみることができますか?

もちろん、これを行うと、HashMap 要素を変更するたびに「圧縮されたラベル」を計算しなければならないという負担が増えるという欠点があります。

この考え方は、.md5 ファイルを使用して、ダウンロードしたファイルが一貫していること (ネットワーク転送による破損がないこと) を確認する方法と似ています。あなたのケースでうまくいくかどうかはわかりませんが

于 2013-03-28T04:42:57.047 に答える
0

同等性を比較する必要があるキーのセットがどのように構成されるかを予測する方法はありますか? もしそうなら、これらのキーのセットのそれぞれに対応するサブマップを構築し、それらのサブマップで単純な .equals() を使用できます。これは、マスター マップに配置するよりも多くの等値比較を行う場合に価値があるかもしれません。そうでなければ、ブルート フォース チェックよりも高速な解決策があるかどうかはわかりません。

于 2013-03-28T04:58:10.917 に答える
0
so far my attempt has been extract my required fields and compare each of them

私の知る限り、これが最善の方法です

于 2013-03-28T04:48:40.343 に答える
0

キーのリストがある場合は、これで十分効率的です。hashmap.get()すでに内部で最適化されているため

public boolean isNotEqual(){
boolean unequal = false;
for(int i=0;i<list.size();i++){
if(ob1.containsKey(list.elementAt(i)) && ob2.containsKey(list.elementAt(i))){
    if(!ob1.equals(ob2)) {
        unequal = true;
        break;
}else{
    unequal = true;
    break;
}
return unequal;
}
于 2013-03-28T04:51:53.990 に答える