4

ハッシュマップの二重ネストされたハッシュマップがあり、キーの存在を確認して新しい値を配置したいと思います。現在、各レベルでキーの存在を確認するためのifステートメントをネストしています。これをコーディングするためのより効率的な方法はありますか?

HashMap<Foo1, HashMap<Foo2, HashMap<Foo3, Double>>> my_map = new HashMap<Foo1, HashMap<Foo2, HashMap<Foo3, Double>>>();

if (my_map.containsKey(foo1key)) {

    if (my_map.get(foo1key).containsKey(foo2key)) {

        if (my_map.get(foo1key).get(foo2key).containsKey(foo3key)) {

             return my_map.get(foo1key).get(foo2key).get(foo3key);
        }
    }
}

double foo3key = getValue();

// do the above steps again to put foo3key into map.
4

1 に答える 1

1

最も効率的な方法(値が常にnull以外であると仮定)は次のとおりです。

HashMap<Foo2, HashMap<Foo3, Double>> map2 = my_map.get(foo1Key);
if(map2!=null) {
  HashMap<Foo3, Double> map3 = map2.get(foo2Key);
  if (map3!=null) {
    Double value = map3.get(foo3Key);
    if (value!=null) {
      return (double)value;
    } else {
      // add value to map3, or whatever
    }
  }
}

これは、次の手法を利用します。

  • get()がnullを返す場合、キーが存在しないことがわかります(null値は許可されていないため)
  • 次のルックアップのために前のgetの戻り値を保存して、getをチェーンする必要がないようにします

ただし、これは少し面倒です。この種の操作を頻繁に行う場合は、別の関数に分解して、次のことを実行できるようにすることをお勧めします。

double value = getNestedValue(my_map,foo1Key,foo2Key,foo3Key);
于 2012-05-24T00:31:14.103 に答える