如您所见,这是一个对象的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::merge
,Integer
来增加地图的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
实现的属性。