实体类数组中操作重复列中属性的方法

版权声明:转载记得宣传奥~。~ https://blog.csdn.net/c_ym_ww/article/details/85627104

最近做数据处理统计日活的数据,遇到一个问题:

用户当天登陆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值。

猜你喜欢

转载自blog.csdn.net/c_ym_ww/article/details/85627104