트리에서 노드 경로의 루트를 나타내는 해시 목록을 작성합니다. 내 기능은 작동하지만 큰 나무 구조보다 훨씬 느립니다. 더 좋은 방법이 있습니까? 한 가지 기능으로 목록을 작성하려고 시도했지만 필자가 원하지 않는 고유 한 해시를 얻습니다.느린 건물 목록 경로
public ArrayList<Integer> makePathList(AbstractTree<String> tree){
StringBuilder buffer = new StringBuilder();
ArrayList<Integer> pl = new ArrayList<Integer>();
ArrayList<StringBuilder> paths = getPaths(tree, buffer);
for(StringBuilder sb : paths){
pl.add(sb.toString().hashCode());
}
return pl;
}
public ArrayList<StringBuilder> getPaths(AbstractTree<String> tree, StringBuilder parent){
ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();
parent.append("/");
parent.append(tree.getNodeName());
list.add(new StringBuilder(parent));
if (!tree.isLeaf()){
int i = 0;
Iterator<AbstractTree<String>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size()){
list.addAll(getPaths(child.next(), new StringBuilder(parent)));
i++;
}
}
return list;
}
UPDATE : 나는 그것을 짓을하는 방법을 트리 탐색하는 동안 해시가 잘못된 답을 제공하지만, 아마도 즉 만드는
마르신의 제안?
public ArrayList<Integer> getPaths(AbstractTree<String> tree, StringBuilder parent){
ArrayList<Integer> list = new ArrayList<Integer>();
parent.append("/");
parent.append(tree.getNodeName());
list.add(new StringBuilder(parent).toString().hashCode());
if (!tree.isLeaf()){
int i = 0;
Iterator<AbstractTree<String>> child = tree.getChildren().iterator();
while (i < tree.getChildren().size()){
list.addAll(getPaths(child.next(), new StringBuilder(parent)));
i++;
}
}
return list;
}
이것은 흥미로운 솔루션처럼 들리지만, 그러한 방법의 예가 있습니까? – Robert
작업 코드를 제공 할 시간이 없지만 기본적으로 StringBuilder 인스턴스에서 경로를 작성하는 대신 패스를 경로 요소의 목록으로 표시하십시오. 각 경로 요소의 이름과 부분 해시는 해당 요소까지입니다. –