//模拟场景人员聚集 //范围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);
});
}
}