gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:20:04 26 4
gpt4 key购买 nike

如您所见,它是一个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 (如果需要的话)。该字符串是 map 中的键。

map 中的值(Integer 对象)是该国家/地区、该性别的 Registro 对象的计数。请参阅this Answer了解如何使用Map::merge使用method reference增加 map 的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.
}

要构建报告,请从两个 map 中获取一组不同的所有键。使用Set为此,作为一个集合消除了重复项。 Map::keySet 返回的 Set实际上是 map 上的 View 而不是单独的集合。因此,我们将一个性别的集合传递给一个新的单独集合的构造函数。对于其他性别,我们调用 Set::addAll 。因此,我们将两个映射的键组合成一个不同的集合。

我们使用TreeSet保持键的自然顺序,匹配 natural orderTreeMap 使用。

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.

要构建报告,请循环集。对于每个键,调用 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 females, 7 males.

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

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

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

Table of map implementations in Java 11, comparing their features

关于java - 我如何计算每个省份有多少男性和女性,以及这些省份是按国家/地区的字母顺序排列的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61312149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com