如您所见,这是一个对象的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 */

最佳答案

每种性别一个Map

一种快速而肮脏的方法是一对Map对象,分别针对男性和女性,其中键是您所在国家和地区的组合,而值是找到的元素计数的Integer

Map< String , Integer > females = new TreeMap<>() ;
Map< String , Integer > males = new TreeMap<>() ;


循环收集Registro对象。对于每个Registro对象,获取国家和地区以及concatenate。使用任意字符作为delimiter,例如pipe |(垂直线),以便以后可以使用pull country and region apart(如果需要)。该字符串是您地图中的键。

地图中的值Integer对象是该性别中该国家/地区的Registro对象的计数。有关使用this Answer使用Map::mergeInteger来增加地图的Integer::sum值的信息,请参见method reference

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使键保持自然顺序,与natural order使用的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.


要生成报告,请循环keys设置。对于每个键,请调用females.getKey取回计数,并调用males.getKey取回计数。如果任何一个返回null,则在该国家/地区报告该性别为零。

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." ;
}



China | Beigin =女性13位,男性7位。


此处描述的方法假定您的Registro对象集合没有被另一个线程修改。

我希望还有其他方法可以解决您的问题,毫无疑问,它可能会更优雅。但这应该得到工作。我自己会使用这种方法。

顺便说一下,这是我制作的图形表,显示了各种Map实现的属性。

java - 我如何计算每个省有多少男人和女人,这些省是按国家/地区按字母顺序排列的?-LMLPHP

10-01 19:05
查看更多