zoukankan      html  css  js  c++  java
  • java实现图分组

    项目中遇到一个问题,一张图有多个子图组成,如果给你各个节点之间的关系,怎样将这些相互关联的节点分组。

    "A->B", "B->C", "C->D", "F->G", "E->F", "H->J"
    以上是节点之间的关系,肉眼可见ABCD是一个子图、FGE是一个,HJ是一个,但是如果图的节点很多,肉眼就搞不定了。
    这个时候我们可以将解体方法告诉电脑,它来帮我们解决。

    public class Test {
        public static void main(String[] args) {
            Multimap<String, String> map = HashMultimap.create();
            List<String> hop = Lists.newArrayList("A->B", "B->C", "C->D", "F->G", "E->F", "H->J");
            for (String s : hop) {
                String[] split = s.split("->");
                String from = split[0];
                String to = split[1];
                //默认from、to都不存在
                boolean fromPresent = false;
                boolean toPresent = false;
                if (isPresent(map, from)) {
                    fromPresent = true;
                }
                if (isPresent(map, to)) {
                    toPresent = true;
                }
                //from/to都不存在,最简单,from做key,将from和to放value里
                if (!fromPresent && !toPresent) {
                    map.put(from, from);
                    map.put(from, to);
                    //from存在,to不存在,要区分from是key还是value
                } else if (!toPresent) {
                    boolean inKey = map.containsKey(from);
                    if (inKey) {
                        map.put(from, to);
                    } else {
                        String valKey = getKeyByValue(map, from);
                        map.put(valKey, to);
                    }
                    //to存在,from不存在,也要区分to是key还是value
                } else if (!fromPresent) {
                    boolean toInKey = map.containsKey(to);
                    if (toInKey) {
                        map.put(to, from);
                    } else {
                        String valKey = getKeyByValue(map, to);
                        map.put(valKey, from);
                    }
                }
                //剩下最后一种可能,from/to都存在,那就不需要处理了
            }
    
            System.out.println(map);
    
        }
    
        /**
         * 判断一个元素是否存在于map中,需要判断两种情况
         *
         * @param map
         * @param key
         * @return
         */
        public static boolean isPresent(Multimap<String, String> map, String key) {
            return map.containsKey(key) || map.containsValue(key);
        }
    
        /**
         * 从map中反向查找value对应的key,前提条件是value存在于map中
         *
         * @param map
         * @param val
         * @return
         */
        public static String getKeyByValue(Multimap<String, String> map, String val) {
            Set<String> keySet = map.keySet();
            for (String s : keySet) {
                Collection<String> values = map.get(s);
                if (values.contains(val)) {
                    return s;
                }
            }
            return null;
        }
    }

    输出:

    {A=[A, B, C, D], F=[E, F, G], H=[H, J]}
  • 相关阅读:
    多组件共享-vuex —— 使用vuex 报错 actions should be function or object with ”handler“
    时间复杂度/空间复杂度
    Nodejs学习(三)-安装nodejs supervisor,提高点效率吧。
    Nodejs学习(二)-express生成器
    Nodejs学习(一)-Nodejs和express的安装和配置
    PHP连接MySQL的时候报错SQLSTATE[HY000] [2002] No such file or directory
    phpstorm 16.1 注册码
    Express安装过程
    NodeJs解析web一例
    NodeJs 连接mysql一例。
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15330663.html
Copyright © 2011-2022 走看看