USERID GENDER BIRTHDAY EDU JOB INCOME PROVINCE CITY ISCITY
13F320E7B5EAD1024AC95C3B208610DB 男 1981 高中/中专/技校 企业/公司一般职员 1501~2000元 内蒙古 呼和浩特 unknown
EA3502C3594588F0E9D5142F99C66627 女 1989 大学本科 学生 无收入 浙江 嘉兴 unknown
1134AC57B5B1D38B7D70C1B6FEAA28CF 男 1995 初中 学生 无收入 广东 汕头 城市
A660D4563B8F62DD5282319CC643D950 男 1979 初中 企业/公司一般职员 2001~3000元 上海 嘉定 乡村
23CE1851341EC1FA9E0C259DE10BF87C 男 1995 高中/中专/技校 学生 无收入 江西 吉安 城市
需求:
1.统计各个省份的人员的平均年龄
2 统计各个省份的男女比例
3 统计所有数据中的城市和农村户口比例
4 统计所有大专以上学历的人口比
分析:
第一和第二题可以放在一起做,都是各个省份的XXX,此时可以new Map,key存省份,value存UserBean(包含用户的所有信息)的List集合
- 对map进行遍历,每个省对应的User年龄做加法,除以list的长度就得到平均年龄
- 男女比例分别用Stream里面的筛子提取出来,返回一个list集合
第三题,new Map ,key存city(城市/农村/城郊),value是UserBean的list集合
- 第三题 : 声明两个值count/countedu count—总人口 ,countedu —大专以上人口,在读取的while循环中就可以求出两个值
代码如下:
public static void main(String[] args) throws Exception {
//1.key各个省份 ,value 对应的UserBean集合
//2.统计各个省份的男女比例
Map<String, List<UserBean>> isProvinceMap = new HashMap<>();
//按城市 农村 储存数据
Map<String, List<UserBean>> isCityMap = new HashMap<>();
BufferedReader br = new BufferedReader(new FileReader("d:/data/demographic.txt"));
//大专以上人口数
int countedu = 0;
//总人数
int count = 0;
//第一行数据弃用
br.readLine();
String line;
while((line = br.readLine())!=null) {
//当读取的line不是空的时候,对数据进行操作
if (line.length()>0) {
count++;
String[] split = line.split("\\s+");
String userId = split[0];
String gender = split[1];
String birthday = split[2];
String edu = split[3];
String job = split[4];
String inCome = split[5];
String province = split[6];
String city = split[7];
String isCity = split[8];
//对birthday简单处理
int age = 2018 - Integer.parseInt(birthday);
//自定义的UserBean
UserBean bean = new UserBean(userId, gender, age, edu, job, inCome, province, city, isCity);
List<UserBean> list = isProvinceMap.getOrDefault(province, new ArrayList<>());
list.add(bean);
isProvinceMap.put(province, list);//得到省份
List<UserBean> list2 = isCityMap.getOrDefault(isCity, new ArrayList<>());
list2.add(bean);
isCityMap.put(isCity, list2);//得到city为key的Map
if ("大专".equals(edu) || "大学本科".equals(edu) || "硕士及以上".equals(edu)) {
countedu++;
}
}
}
//统计各个省份的人员的平均年龄和男女比例
getAgeandGerder(isProvinceMap);
//统计所有数据中的城市和农村户口比例
getChengshiNongcunBiLi(isCityMap);
System.out.println(count);
System.out.println(countedu);
System.out.println("所有大专以上学历的人口比"+1.0*countedu/count);
br.close();
}
private static void getChengshiNongcunBiLi(Map<String, List<UserBean>> isCityMap) {
List<UserBean> list = isCityMap.get("城市");
List<UserBean> list2 = isCityMap.get("乡村");
double res = 1.0*list.size()/list2.size();
System.out.println(res);
}
private static void getAgeandGerder(Map<String, List<UserBean>> isProvinceMap) {
Set<Entry<String, List<UserBean>>> set = isProvinceMap.entrySet();
for (Entry<String, List<UserBean>> entry : set) {
//男性用户的集合
List<UserBean> manCollect = entry.getValue().stream().filter(o->"男".equals(o.getGender())).collect(Collectors.toList());
//女性用户的集合
List<UserBean> femaleCollect = entry.getValue().stream().filter(o->"女".equals(o.getGender())).collect(Collectors.toList());
double res = 1.0*manCollect.size()/femaleCollect.size();
System.out.println(entry.getKey()+"省的男女比例是:"+res);
Integer sum = entry.getValue().stream().map(o->o.getage()).reduce((o1,o2)->o1+o2).get();
double res1 = 1.0*sum/entry.getValue().size();
System.out.println(entry.getKey()+"省的平均年龄:"+res1);
System.out.println("-----------------------------------");
}
}
//UserBean,后面的getters/setters,构造方法就省略了,都是可以自动生成的
public class UserBean {
private String userId;
private String gender;
private int age;
private String edu;
private String job;
private String inCome;
private String province;
private String city;
private String isCity;
......}