3

キーとして文字列を持ち、その値としてセットを持つ2つのマップがあります。これらの2つのマップは、同じキーを共有できます。2つのマップが同じキーを持っている場合、2つのSet値をマージしようとしています。問題は、2番目のマップがnullである可能性があり、2つのマップ間ですべてのキーが共有されているわけではないため、セットもnullになる可能性があることです。私はいくつかのオプションを考え出しましたが、それらはすべてかなり乱雑に見えます。誰かがそれを行うためのより効率的/よりきれいな方法を持っているかどうか疑問に思っていました。これは私がこれまでに持っているものです:

Set<String> mergedSet = (firstMap.containsKey(commonKey)) ? firstMap.get(commonKey) : new HashSet<String>();

mergedSet.addAll(secondMap != null && secondMap.containsKey(commonKey) ? secondMap.get(commonKey) : new HashSet<String>());

4

2 に答える 2

5

の代わりにGuavaのHashMultimapMap<String, Set<String>>を使用します。次の利点があります。

  • 特定のキーに複数の値を追加するためのショートカットメソッド。このキーのセットがすでに存在するかどうかを気にする必要はありません。
  • get(key)このキーに何も保存されていない場合でも、が呼び出されると常にnull以外のSetが返されます。

したがって、コードは次のようになります。

Set<String> mergedSet = Sets.union(firstMultimap.get(commonKey),
                                   secondMultimap.get(commonKey));

セットは単に2つのセットのビューであり、すべての要素をコピーする必要がありません。ただし、コピーが必要な場合は、

Set<String> mergedSet = Sets.newHashSet(Sets.union(firstMultimap.get(commonKey),
                                                   secondMultimap.get(commonKey)));

外部ライブラリを使用したくない場合は、コードはほとんど問題ありません。Collections.singletonSet()ただし、不要な空のセットの作成を避けるために、2番目のフォールバックセットに使用します。そして注意してください:あなたのコードは最初のセットを変更しました。コピーは作成しません。したがって、最終的には、最初のマップのすべてのセットが実際にはマージされたセットになります。

于 2012-12-18T20:21:51.437 に答える
1

ある程度、これはスタイルの問題ですが、コメントすることがいくつかあります。まず、メソッドcontainsKeyとメソッドのコストが等しいため、nullの戻り値getを呼び出してチェックする方が効率的です。get次に、この例では、をに設定します。これは、セットを変更することを意味し、マージされたセットにmergedSetなります。のセットを変更したくないと思います。私はより長いものを使用することをお勧めします:firstMap.get(commonKey)firstMapfirstMap

Set<String> mergedSet = new HashSet<String>();

Set<String> firstSet = firstMap.get(commonKey);
if (firstSet != null)
{
    mergedSet.addAll(firstSet);
}

if (secondMap != null)
{
    Set<String> secondSet = secondMap.get(commonKey);
    if (secondSet != null)
    {
        mergedSet.addAll(secondSet);
    }
}
于 2012-12-18T20:37:01.430 に答える