Как я могу подсчитать, сколько мужчин и женщин в каждой провинции, и что эти провинции упорядочены по странам в алфавитном порядке? - PullRequest
0 голосов
/ 20 апреля 2020

Как видите, это ArrayList объектов, и мне нужно, чтобы каждый из этих объектов подсчитывал их атрибуты провинции на основе мужчин и женщин

class Registro {
    String region;
    String province;
    String gender;
}

List<Registro> reg = new ArrayList<Registro>();
        reg.add(new Registro("China","Beigin","male"));
        reg.add(new Registro("China","Beigin","female"));
        reg.add(new Registro("China","x","male"));
        reg.add(new Registro("China","x","female"));
        reg.add(new Registro("China","x","male"));
        reg.add(new Registro("EEUU","SB","female"));
        reg.add(new Registro("EEUU","SB","female"));
        reg.add(new Registro("EEUU","CAL","male"));
        reg.add(new Registro("EEUU","CAL","male"));

Желаемый результат

  /*

China, Beigin, 1 male, 1 female 
China,    x  , 2 male, 1 female 
EEUU,    SB  , 0 male, 2 female 
EEUU,    CAL , 2 male, 0 female */

1 Ответ

0 голосов
/ 20 апреля 2020

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 реализаций.

Table of map implementations in Java 11, comparing their features

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...