如何在Java 7中使用Map表示的图形中跟随边?

时间:2017-06-12 14:58:03

标签: java recursion

Collection<String> sources = new ArrayList<String>();
        sources.add("a");
        sources.add("c");
        sources.add("x");
        sources.add("a1");
        sources.add("y");

        Collection<String> targets = new ArrayList<String>();
        targets.add("b");

        Collection<String> overAllFieldMaps = new ArrayList<String>();
        overAllFieldMaps.add("a>b");
        overAllFieldMaps.add("c>a");
        overAllFieldMaps.add("x>c");
        overAllFieldMaps.add("a1>x");
        overAllFieldMaps.add("y>c");

        Map<String, String> map = new HashMap<String, String>();
        for (String aFieldMap : overAllFieldMaps) {
            String[] splittedField = aFieldMap.split("\\>");
            String sourceName = splittedField[0];
            String targetName = splittedField[1];
            map.put(sourceName, targetName);
        }



Expected Result:


a -> b

c -> a -> b

x -> c -> a -> b

a1 -> x -> c -> a -> b

y -> c -> a -> b

我正在尝试在map中可用的数据之间实现路径的递归。任何人都可以帮忙吗?

简单来说,我想要实现的是在Java中使用等效的Connect by Prior / Common Table Expression。

2 个答案:

答案 0 :(得分:0)

您可以使用map#containsValue检查边缘是否被某物指向。然后,您修改您要查找的值。

示例(假设只有一个链接指向下一个边缘):

String print = "";
String end = "b";
while (true) {
    if (!map.containsValue(end)) // Checking if we're at the utmost start
        break;                   // if yes we stop iterating and go print the result
    for (Entry<String, String> entry : map.entrySet()) {
        if (entry.getValue().equals(end)) {          // Find the path that points to our edge
             System.out.println(print);              // Printing what we had before
            print = entry.getKey().concat(" -> " + print); //Preparing the next output
            end = entry.getKey(); // Updating the edge whose source we're looking for
            break;
        }
    }
}
System.out.println(print); // Final output

编辑: Andy Thomas向我指出,问题在遍历顺序上并不明确:从最后到第一个或从头到尾。

在后一种情况下,您只需按值更改键:检查是否存在键,然后读取其值并将其作为新键。

答案 1 :(得分:-1)

如果您想使用图表,您可能需要使用图表框架/库。 Map是一个简单的键/值结构,您无法直接使用它来表示图形。

此外,我认为您有兴趣找到两个节点之间的路径:有很多理论,当然还有很多实现可以使用。我建议你去谷歌java图库。

编辑

假设图表很小并且你可以在不考虑的情况下粗暴地强制它,你可以这样做:

    String target = "b";
    for(String source : sources) {
        String cursor = source;
        StringBuilder path = new StringBuilder();
        path.append(source);
        while (cursor!=null && !cursor.equals(target)) {
            cursor = map.get(cursor);
            path.append(" -> ").append(cursor);
        }
        if(cursor != null) {
            System.out.println(path);
        }
    }

此代码很小,当然不是最佳的,但它会提供您正在寻找的结果。