項目需求:將一個數據地圖中具有閉環的路徑全部找出來,並顯示在前臺頁面。
閉環數據準備:
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;
}