我有一个包含自我引用对象的ArrayList的Object。该ArrayList中的每个Object包含最多n度的相同结构。现在我必须在结构中搜索一个字符串,如果发现我必须一直打印到根。这是一个样本
MyClass {
string name;
ArrayList<MyClass> subClasses;
}
哪种数据结构最适合这样做。或者我不需要使用它。
亲切的问候
答案 0 :(得分:2)
你可以在MyClass上有一个方法,如下面的
public List<String> findPathOfName(String nameToFind) {
List<String> result = new ArrayList<String>();
if (nameToFind.equals(name)) {
result.add(name);
} else {
for (MyClass aSubClass: subClasses) {
List<String> subResult = aSubClass.findPathOfName(nameToFind);
if (!subResult.isEmpty()) {
result.add(name);
result.addAll(subResult);
break;
}
}
}
return result;
}
基本上递归地遍历结构并找到路径。返回列表将包含类似personA / personB / etc的路径。
答案 1 :(得分:1)
这是http://en.wikipedia.org/wiki/Composite_pattern。试试我的版本
static class MyClass {
String name;
List<MyClass> subClasses;
MyClass(String name) {
this.name = name;
}
String search(String s, String path) {
if (!path.isEmpty()) {
path += "->";
}
path += name;
if (!s.equals(name)) {
if (subClasses == null) {
return null;
}
for (MyClass c : subClasses) {
return c.search(s, path);
}
}
return path;
}
}
public static void main(String[] args) throws Exception {
MyClass c1 = new MyClass("c1");
MyClass c2 = new MyClass("c2");
MyClass c3 = new MyClass("c3");
c1.subClasses = Arrays.asList(c2);
c2.subClasses = Arrays.asList(c3);
System.out.println(c1.search("c3", ""));
}
输出
c1->c2->c3