9

私はグーグルグアバ12を使用していて、地図を持っています:

Map<OccupancyType, BigDecimal> roomPrice;

私はセットを持っています:

Set<OccupancyType> policy;

roomPrice mapに基づいてエントリをpolicyフィルタリングし、フィルタリングされたマップを返すにはどうすればよいですか?

filteredMapからのすべての値が必要policyです。roomPriceマップにポリシーからのエントリがない場合は、代わりにデフォルト値を入力したいと思います。

4

3 に答える 3

29

鍵のセットがあるので、Maps.filterkeys()を使用する必要があります。また、Guavaは、すぐに使用できる非常に優れた述語のセットを提供します。あなたの場合、Predicates.in()のようなものが機能するはずです。

つまり、基本的には次のようになります。

Map<OccupancyType, BigDecimal> filteredMap
    = Maps.filterKeys(roomPrice, Predicates.in(policy));

それが役に立てば幸い。

于 2012-06-27T08:09:34.767 に答える
2
  • をオーバーライドして実装し equalsます。hashcodeOccupancyType
  • のキーセットをループしてroomPrice、フィルターに含まれる要素を収集します。

このようなもの:

Map<OccupancyType, BigDecimal> filteredPrices = new HashMap<OccupancyType, BigDecimal>();
for(OccupancyType key : roomPrice.keySet()) {
    if(policy.contains(key) {
        filteredPrices.put(key, roomPrice.get(key));
    }
}

アップデート

Google Guavaを少し読んだ後、次のようなことができるはずです。

Predicate<OccupancyType> priceFilter = new Predicate<OccupancyType>() {
    public boolean apply(OccupancyType i) {
        return policy.contains(i);
    }
};

その後

return Maps.filterValues(roomPrice, priceFlter);

トリックを行う必要があります。

于 2012-06-27T07:47:30.177 に答える
0

Guavaを使用する必要はありません。また、Maps.filterKeys()は、大きなマップのパフォーマンスが非常に悪い結果を生成する可能性があります。

// (new map can be initialized to better value to avoid resizing)
Map<OccupancyType, BigDecimal> filteredMap = new HashMap<>(roomPrice.size());
for (OccupancyType key: policy) {
    // contains() and get() can usually be combined
    if (roomPrice.contains(key)) {
       filteredMap.put(key, roomPrice.get(key));
    }
}
于 2021-03-29T11:11:21.763 に答える