如何排除闭环中重复的环路

项目需求:将一个数据地图中具有闭环的路径全部找出来,并显示在前台页面。

闭环数据准备:

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

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