项目需求:将一个数据地图中具有闭环的路径全部找出来,并显示在前台页面。
闭环数据准备:
A→B→C→D→A
B→C→D→A→B
C→D→A→B→C
D→A→B→C→D
W→H→Y→Z
非重复回路数据:
A→B→C→D→A
W→H→Y→Z
另外三条数据其实和第一条是相似的。
程序如何发现并找出有效闭环数据呢?
解决思路:1、构建一个集合loops,遍历所有闭环,判断(当前路径是否在集合loops中,若不在,则添加进来)。好了不多说了,直接上代码:
private List<String> removeEchoLoop(List<String> allLoopPaths) {
List<String> result = new ArrayList<String>();
result.add(allLoopPaths.get(0));
for (String path : allLoopPaths) {
//结果集中不包含当前路径,则添加
if (!containsPath(path, result)) {
result.add(path);
}
}
return result;
}
private boolean containsPath(String loop, List<String> result) {
for (String path : result) {
if (isAlikePath(loop, path)) {
return true;
}
}
return false;
}
private boolean isAlikePath(String path1, String path2) {
List<String> path1Tolist = Arrays.asList(path1.split("_"));
List<String> path2Tolist = Arrays.asList(path2.split("_"));
//长度不相等,认为路径不相似
if (path1Tolist.size() != path2Tolist.size()) {
return false;
}
//第二个路径中存在某一个节点在另外一个路径中不存在,认为路径不相似
boolean isAlike = true;
for (String list2 : path2Tolist) {
Boolean hasNode = false;
for (String list1 : path1Tolist) {
if (!list2.equals(list1)) {
continue;
} else {
hasNode = true;
break;
}
}
isAlike = isAlike && hasNode;
}
return isAlike;
}