2014-04-15 2 views
0

Java에서 콘솔 트리에 쓰기를 원한다면 매개 변수 중 하나가 트리의 깊이이고 노드 이름 앞에 표 수가 많습니다.
자바에서 매개 변수에 다중 문자열 concording

public void print(TreeNode node, int depth) 
//something ... 
String prefix = ""; 
for(int i = 0; i <depth; i++) { 
    prefix += "\t"; 
} 

//.... 
List<TreeNode> subnodes = node.getNodes(); 
    for(int i = 0; i < subnodes.size(); i++) { 
    System.out.println(prefix+ subnodes.get(i).getTitle()); //title is name of node; 
    } 
} 

을 위해 다음을하여 할 접두어 문자열 연결에 대한 더 나은 솔루션인가?
예를 들어 2 = "depth"인 경우 "\ t \ t"를 의미하는 2x "\ t"를 원합니다. 깊이가 가변적이라면 나는 깊이 x "\ t"를 원한다. 내 솔루션은이 단순한 용도로 사용하지만 더 좋을까요? 당신은 StringBuilder 클래스를 사용하기 위해 프로그램을 변경할 수 있습니다

답변

1

: 자바에서

StringBuilder prefix = new StringBuilder(); 
for (int i = 0; i < depth, ++i) { 
    prefix.append("\t"); 
} 

.... 

System.out.println(prefix.toString() + subnodes.get(i).getTitle()); 

String는 불변이며, 당신이 그것을 수정할 때, String의 acually 새로운 복사본을 만들어 그 이유는. 나무가 정말로 크고 깊다면 (높이가 큰 경우) - StringBuilder은 더 빠르게 작동하고 메모리를 적게 소비해야합니다.

Map<Integer, String> prefixes = new HashMap<Integer, String>(); 

private void fillPrefixes(int maxTreeDepth) { 
    StringBuilder prefix = new StringBuilder(); 

    for (int i = 0; i < maxTreeDepth; ++i) { 
     prefixes.put(i, prefix.toString()); 
     prefix.append("\t"); 
    } 
} 

이 거대한 나무의 경우에 유용 할 수 있습니다, 때>과 같이 미리 계산 된 접두사 - for 루프가 문제가

경우 심도 수준의지도를 저장하는 등의 솔루션을 고려할 수 있습니다 9000 번 이상 접두사를 다시 계산해야합니다. 기술적으로, for 루프는 여전히 있지만, 필요할 때마다 프리픽스를 다시 계산하지는 않습니다. 동전의 또 다른 측면은 메모리 소비량 증가입니다. 따라서 올바른 결정을 내리려면 조기 최적화를 피하고 정말로 필요할 때만 수행하고 무엇이 더 중요한지 (메모리 또는 실행 시간) 결정해야합니다.

+0

그럼이 흥미로운 점은 내가 아마 내 실제 솔루션을 사용하지만, 가능하면 내 질문은 사실이었다 를 위해 제거하십시오. – user1097772

+0

가능한 교환 솔루션으로 게시물을 업데이트했습니다. –

0

Apache Commons Lang을 사용하실 수 있습니다.

그것을 위해

메이븐 의존성 :

<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-lang3</artifactId> 
    <version>3.0</version> 
</dependency> 

그리고 샘플 사용 :

import org.apache.commons.lang.StringUtils 
... 
prefix = StringUtils.repeat("\t", depth);