A Map
для каждого пола
Одним быстрым и грязным подходом будет пара Map
объектов для каждого мужчины и женщины, где ключ является комбинацией ваша страна и регион, в то время как значение Integer
для количества найденных элементов.
Map< String , Integer > females = new TreeMap<>() ;
Map< String , Integer > males = new TreeMap<>() ;
L oop ваша коллекция Registro
объектов. Для каждого Registro
объекта получите страну и регион и сцепьте . Используйте некоторый произвольный символ в качестве разделителя , например pipe |
(ВЕРТИКАЛЬНАЯ ЛИНИЯ), чтобы позже вы могли отделить страну и регион от (если необходимо) быть). Эта строка является ключом на вашей карте.
Значение на карте, объект Integer
, представляет собой число Registro
объектов для этой страны-региона в данном поле. См. этот ответ , чтобы узнать, как использовать Map::merge
для увеличения значения Integer
карты с использованием справочного метода , Integer::sum
.
String key = registro.getCountry() + "|" + registro.getRegion() ;
if( registro.getSex().equals( "female" ) )
{
females.merge( key , 1 , Integer::sum ) ;
}
else if( registro.getSex().equals( "male" ) )
{
males.merge( key , 1 , Integer::sum ) ;
}
else // defensive programming
{
… handle error condition, illegal state.
}
Чтобы создать отчет, получите отдельный набор всех ключей на обеих картах. Для этого используйте Set
, так как набор исключает дубликаты. Set
, возвращаемое Map::keySet
, на самом деле является видом на карту, а не отдельной коллекцией. Таким образом, мы передаем этот набор для одного пола конструктору нового и отдельного набора. Для другого пола мы звоним Set::addAll
. Таким образом, мы объединяем ключи двух карт в один отдельный набор.
Мы используем TreeSet
, чтобы сохранить ключи в естественном порядке, в соответствии с естественным порядком , используемым TreeMap
.
Set< String > keys = new TreeSet<>( females.keySet() ) ; // Build a fresh independent set from the set returned by `Map::keySet`.
keys.addAll( males.keySet() ) ; // Add in all the keys from the other map, automatically eliminating duplicates.
Чтобы построить отчет, установите l oop keys
. Для каждого ключа позвоните females.getKey
, чтобы получить счет, и наберите males.getKey
, чтобы получить счет. Если любой из них возвращает ноль, укажите ноль для этого пола в этой стране-регионе.
for( String key : keys ){
Integer countFemales = Objects.requireNonNullElse( females.getKey( key ) , new Integer( 0 ) ) ;
Integer countMales = Objects.requireNonNullElse( males.getKey( key ) , new Integer( 0 ) ) ;
String output = key + " = " + countFemales + " females, " + countMales + " males." ;
}
Китай | Beigin = 13 женщин, 7 мужчин.
Описанный здесь подход предполагает, что ваша коллекция Registro
объектов не изменяется другим потоком ,
Я ожидаю, что есть другие способы решения вашей проблемы, вероятно, более элегантные, без сомнения. Но это должно получить работу. Я бы сам использовал этот подход.
Кстати, вот созданная мной графическая таблица c, показывающая атрибуты различных Map
реализаций.