//模拟场景人员聚集 //范围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 -> {//范围 距离小于5List<Device> list = deviceList.stream().filter(i -> Math.abs(k.getDistance() - i.getDistance()) < 5).collect(Collectors.toList());//人数 大于 5if (list.size() > 5) {List<Integer> deviceIds = list.stream().map(i -> i.getDeviceId()).collect(Collectors.toList());deviceIds.sort(new Comparator<Integer>() {@Overridepublic 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>() {@Overridepublic 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);});}
}