通过键在hashmap中聚合值

时间:2014-02-04 04:44:00

标签: java collections

考虑一个简单的HashMap<Integer,Integer>。如何获取存储的所有值,这些键是5的倍数?我已经在JavaCollections工作了一段时间,但突然间我一无所知。

任何帮助都将受到高度赞赏。

此致

萨里尔

2 个答案:

答案 0 :(得分:6)

List<Integer> values = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
  if (entry.getKey() % 5 == 0) {
     values.add(entry.getValue());
  }
}

FWIW,类似的Java 8方法可能看起来像

map.entrySet().stream()
   .filter(entry -> entry.getKey() % 5 == 0)
   .map(Entry<Integer, Integer>::getValue)
   .collect(toList());

答案 1 :(得分:2)

Guava有一些辅助方法可以帮助您实现这一目标。特别是Maps.filterKeys(Map, Predicate)

// populate a Map
Map<Integer, Integer> map = new HashMap<>();
map.put(3, 0);
map.put(15, 42);
map.put(75, 1234);

// filter it
Map<Integer, Integer> filtered = Maps.filterKeys(map, new Predicate<Integer>() {
    @Override
    public boolean apply(Integer input) {
        return input % 5 == 0; // filter logic
    }
});

// get the values
System.out.println(filtered.values());

打印

[1234, 42]

正如路易斯所说,"this isn't actually more efficient -- or even shorter -- than the "traditional" for-each approach."