如何排除閉環中重複的環路

項目需求:將一個數據地圖中具有閉環的路徑全部找出來,並顯示在前臺頁面。

閉環數據準備:

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;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章