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

 

posted @   Mars.wang  阅读(137)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示