项目中遇到一个问题,一张图有多个子图组成,如果给你各个节点之间的关系,怎样将这些相互关联的节点分组。
"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]}