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。
答案 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);
}
}
此代码很小,当然不是最佳的,但它会提供您正在寻找的结果。