需求:sceneList和realList是两个不同的集合,现在要取出两个集合中相同元素的数量。
方法一:
使用retainAll()方法去除不相同元素,之后的集合size()就是两集合的相同元素数量大小
这里需注意的是:使用retainAll()会删除A集合中不存在于集合B中的元素。
方法二:
循环判断集合A的元素是否存在于集合B。新建一个空集合C,将相同数据放入C里,集合C的size()就是A和B相同元素的数量。
实体:
@Data
public class SceneSortDto implements Serializable {
@ApiModelProperty(value = "场景id:-")
private Integer id;
@ApiModelProperty(value = "场景名称")
private String name;
@ApiModelProperty(value = "相同元素数量")
private Integer sort;
}
实现:
public List<SceneSortDto> sceneSort() {
//获取全部场景
List<SceneSortDto> scenes = sceneMapper.queryAllSceneInfo();
//遍历每一个场景,获取到每一个场景的设备状态集合和实际的设备状态集合
for (SceneSortDto scene : scenes) {
List<SceneEquDto> sceneList = equipmentMapper.judgeScene(scene.getId());
List<SceneEquDto> realList = equipmentMapper.realSceneSb(scene.getId());
//方法1,使用retainAll会删除A(realList)集合中不存在于集合B(sceneList)中的元素
realList.retainAll(sceneList);
scene.setSort(realList.size());//将剩余的相同元素集合大小放进sort字段
//方法2
/*List<SceneEquDto> listNew = new ArrayList<>();
realList.forEach(e -> {
if (sceneList.contains(e)) {
listNew.add(e);
}
});
scene.setSort(listNew.size());*/
}
scenes.sort(Comparator.comparing(SceneSortDto::getSort).reversed());//按照sort从大到小将集合排序
return scenes;
}
获取到相同元素数量后,可使用Comparator方法根据相似度将集合从大到小排序。
另外笔记:
如果只是判断两个集合是否有相同数据,可直接用Collections.disjoint(Collection<?> c1, Collection<?> c2),
若Collections.disjoint(list1, list2)返回true就是有相同元素,返回false没有相同元素
if (Collections.disjoint(list1, list2)) {
System.out.println("有相同的元素");
}else{
System.out.println("没有相同的元素");
}