2014-04-15 33 views
0

我想在recusive函數中寫入java中的控制檯樹,其中一個參數是樹的深度,我想在節點名稱之前將它用於製表符的數量。
根據java中參數的多個連接字符串

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 =深度,我想要做2倍「\ t」,意思是「\ t \ t」。如果深度是可變的,我想深度x「\ t」; 我的解決方案適用於這個簡單的東西嗎?

回答

1

你可能要改變你的程序才能使用StringBuilder類:

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

.... 

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

String在Java中是不變的,這就是爲什麼當你修改,創建的String acually新副本。如果你的樹真的很大很深(或高:) :) StringBuilder應該工作得更快,並消耗更少的內存。

如果for環出了問題,你可以考慮這樣的解決方案,存儲深度級別的地圖 - >預先計算如下前綴:

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"); 
    } 
} 

這可能是巨大的樹木的情況下非常有用,當你真的重新計算超過9000次的前綴。從技術上講,for循環仍然存在,但每次需要時都不要重新計算前綴。硬幣的另一面是增加的內存消耗。因此,爲了做出正確的決定,您需要避免過早的優化,只有在真正需要時才做,並且決定哪些更重要 - 內存或執行時間。

+0

嗯,這是有趣的,我可能會在我的實際解決方案中使用它,但我的問題其實是,如果有可能擺脫爲了。 – user1097772

+0

我已更新了可能權衡解決方案的帖子。 –

0

您可以使用Apache Commons Lang。

它Maven的依賴:

<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);