最近做数据处理统计日活的数据,遇到一个问题:
用户当天登陆10次,就会发10条数据,运营想要看这个用户的当天登陆总时长,就需要把这个10条数据即实体类中的日活属性相加。实际操作中,10条数据不可能整齐排列完全,是参差不齐的。也不能在数据库层进行操作(太慢了~。~)。就运用了map+list这2种数据结构去处理。(一般重复性的问题都可以用map的特性去处理)
写完测试完之后,跟运营沟通,发现不需要这个需求(X.X)。不过已经写好了方法,就在博客中记录下来,提醒自己。
实体类:
@Data
public class DailyDTO {
/**
* 设备号
*/
private String deviceNumber;
/**
* 手机号
*/
private String phoneNum;
/**
* 停留时间
*/
private String stayTime;
@Override
public boolean equals(Object o) {
//强制类型转换
DailyDTO dailyDTO = (DailyDTO) o;
//比较属性值
return Objects.equals(getDeviceNumber(), dailyDTO.getDeviceNumber()) &&
Objects.equals(getPhoneNum(), dailyDTO .getPhoneNum());
}
@Override
public int hashCode() {
return Objects.hash(getDeviceNumber(), getPhoneNum());
}
}
实体类中需要重写equals和hashCode方法,因为要将实体类作为Map中的key值,需要自定义规则,这边是根据设备号和手机号去进行hash来判断是否相等,然后进行停留时间的相加。
Controller中的方法:
@GetMapping("dataConvert")
public void dataConvert() {
List<DailyDTO> dailyDTOList= 需要进行操作的数组~。~;
Map<DailyDTO, Integer> map = new HashMap<>();
for (DailyDTO dailyDTO : dailyDTOList) {
//判断是否存在key值
if (map.containsKey(dailyDTO)) {
int time = map.get(dailyDTO);
int timePlus = time + Integer.parseInt(dailyDTO.getStayTime());
map.put(dailyDTO, timePlus);
} else {
map.put(dailyDTO, Integer.parseInt(dailyDTO.getStayTime()));
}
}
for (Map.Entry<DailyDTO, Integer> entry : map.entrySet()) {
logger.info("{}..{}", entry.getKey(), entry.getValue());
}
}
一个for循环再加一个map就能搞定。主要是定式思维,没想着map中把实体类作为key值。