模拟人员聚集报警

//模拟场景人员聚集
//范围5米 人员聚集数6个以及6个以上报警

设备信息类

package com.example.demo.udp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
/**
 * 模拟设备
 */
public class Device {

    /**
     * 设备id
     */
    private Integer deviceId;

    /**
     * 距离
     */
    private Integer distance;
}

集合元素数排序工具

package com.example.demo.udp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
/**
 * 根据集合元素个数排序的工具
 */
public class SortUti {

    private List<Integer> sort;
}

算法实现

package com.example.demo.udp;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.compress.utils.Sets;
import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.stream.Collectors;


public final class DeviceTest {


    public static void main(String[] args) throws Exception {
        //模拟场景人员聚集
        //范围5米 人员聚集数6个以及6个以上报警

        List<Device> deviceList = Lists.newArrayList();
        Device d1 = Device.builder().deviceId(1).distance(1).build();

        Device d2 = Device.builder().deviceId(2).distance(2).build();
        Device d3 = Device.builder().deviceId(3).distance(3).build();
        Device d4 = Device.builder().deviceId(4).distance(4).build();
        Device d5 = Device.builder().deviceId(5).distance(5).build();
        Device d6 = Device.builder().deviceId(6).distance(6).build();
        Device d7 = Device.builder().deviceId(7).distance(7).build();
        Device d8 = Device.builder().deviceId(8).distance(8).build();
        Device d9 = Device.builder().deviceId(9).distance(9).build();
        Device d10 = Device.builder().deviceId(10).distance(10).build();
        Device d11 = Device.builder().deviceId(11).distance(11).build();
        Device d12 = Device.builder().deviceId(12).distance(12).build();
        Device d13 = Device.builder().deviceId(13).distance(13).build();
        deviceList.add(d5);
        deviceList.add(d7);
        deviceList.add(d6);
        deviceList.add(d3);
        deviceList.add(d2);
        deviceList.add(d4);
        deviceList.add(d11);
        deviceList.add(d1);
        deviceList.add(d9);
        deviceList.add(d8);
        deviceList.add(d10);
        deviceList.add(d12);
        deviceList.add(d13);
        Map<Integer, String> map = Maps.newConcurrentMap();
        Set<String> sets = Sets.newHashSet();
        List<SortUti> sortUtis = Lists.newArrayList();
        deviceList.forEach(k -> {
            //范围 距离小于5
            List<Device> list = deviceList.stream()
                    .filter(i -> Math.abs(k.getDistance() - i.getDistance()) < 5)
                    .collect(Collectors.toList());
            //人数 大于 5
            if (list.size() > 5) {
                List<Integer> deviceIds = list.stream().map(i -> i.getDeviceId()).collect(Collectors.toList());
                deviceIds.sort(new Comparator<Integer>() {
                    @Override
                    public int compare(Integer o1, Integer o2) {
                        return o2 - o1;
                    }
                });
                SortUti ss = SortUti.builder().sort(deviceIds).build();
                sortUtis.add(ss);
                map.put(k.getDeviceId(), StringUtils.join(deviceIds, ","));
            }
        });
        sortUtis.sort(new Comparator<SortUti>() {
            @Override
            public int compare(SortUti o1, SortUti o2) {
                return o2.getSort().size() - o1.getSort().size();
            }
        });
        sortUtis.forEach(k -> {
            System.out.println(StringUtils.join(k.getSort(), ","));
        });
        System.out.println("--------------------------------");

        for (SortUti ss : sortUtis) {
            String dd = StringUtils.join(ss.getSort(), ",");
            boolean flag = true;
            A:
            for (String str : sets) {
                if (str.contains(dd)) {
                    flag = false;
                    break A;
                }
            }
            if (flag) {
                sets.add(dd);
            }
        }
        //生成聚集事件 以及聚集人员的信息 设备id
        //sets为生成的结果
        sets.forEach(k -> {
            System.out.println(k);
        });

    }
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非ban必选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值