Ответ 1
Как насчет:
Map map1 = ...;
Map map2 = ...;
Map result = new ...(map1);
result.keySet().retainAll(map2.keySet());
или
Map map1 = ...;
Map map2 = ...;
Set result = new ...(map1.keySet());
result.retainAll(map2.keySet());
Есть ли способ в java.util.Map
или какой-либо утилите для выполнения пересечения на двух картах? (Чтобы пересечь две карты "ключами" )
Я не могу найти. Я всегда могу реализовать свою собственную логику пересечения, но я надеялся, что в одном из классов java.util.*
будет выполняться некоторая операция.
Как насчет:
Map map1 = ...;
Map map2 = ...;
Map result = new ...(map1);
result.keySet().retainAll(map2.keySet());
или
Map map1 = ...;
Map map2 = ...;
Set result = new ...(map1.keySet());
result.retainAll(map2.keySet());
Если вы используете Guava, вы можете использовать Maps.difference
, чтобы получить MapDifference
, из которого вы можете извлечь карты entriesInCommon()
и entriesDiffering()
в качестве карт. (Раскрытие информации: Я вношу свой вклад в Гуаву.)
Guava Sets.intersection(Set, Set)
должен выполнить задание, с помощью набора ключей каждой карты в качестве параметров.
Чтобы проверить пересечение, вы можете использовать операцию containsAll(). Which 'Возвращает true, если этот набор содержит все элементы указанной коллекции. Если указанный набор также является набором, этот метод возвращает true, если он является подмножеством этого набора. '
Чтобы получить коллекцию этих пересекающихся элементов, вы можете использовать операцию keepAll().
Эти методы найдены здесь
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Set.html
Я бы порекомендовал apache c ollectionUtils # intersection
Выполните следующие действия:
Collection intersection=
CollectionUtils.intersection(map1.keySet(),map2.keySet());
Зациклите ключи одной карты, посмотрите, не находятся ли они на второй карте:
private Map getIntersection(Map mapOne, Map mapTwo)
{
Map intersection = new HashMap();
for (Object key: mapOne.keySet())
{
if (mapTwo.containsKey(key))
intersection.put(key, mapOne.get(key));
}
return intersection;
}