2012-04-26 23 views
0

我想用遞歸方法首先我已經聲明的變量遞歸方法最大深度 - 靜態變量

public static int maxdepth=0; 

private static void GetDepth(NodeList nl, int level,int maxdepth) {  

    level++; 
    if (maxdepth<level) 
    { 
     maxdepth= level; 
    } 
    if(nl != null && nl.getLength() > 0){ 
     for (int i = 0; i < nl.getLength(); i++) { 
      Node n = nl.item(i); 
      if (n instanceof Element) 
      {    
      GetDepth(n.getChildNodes(), level, maxdepth); 
      } 
     } 

    } 

} 

public static void main(String[] args) { 
    NodeList nl = root.getChildNodes(); 
    GetDepth(nl,level,maxdepth); 
    System.out.println(maxdepth); 
} 

得到一個XML文件的最大深度,當我將顯示變量MAXDEPTH的值,我接收值爲0,如同聲明

+0

你有兩個名爲maxdepth的變量,所以在你的第一個方法中,當你說maxdepth = level時,你隻影響在你的方法論證中聲明的變量,而不是你在類中聲明的實際字段。 – Austin 2012-04-26 15:20:36

+0

注意,遞歸調用中更常見的做法是在遞歸調用時增加級別+ 1:GetDepth(n.getChildNodes(),level + 1) – 2012-04-26 15:38:00

回答

2

你可以做到這一點爲使用XPath 2.0一個班輪:

max(for $n in //* return count($n/ancestor::*)) 

即使在Java中,你會使其更加困難比是:

public int maxDepth(Node node) { 
    int max = 0; 
    NodeList kids = node.getChildNodes(); 
    if (kids.getLength() == 0) { 
    return 0; 
    } 
    for (int i=0; i<kids.getLength(); i++) { 
    int kidMax = maxDepth(kids.item(i); 
    if (kidMax > max) max = kidMax; 
    } 
    return max + 1; 
} 

未經測試。

4

int maxdepth中的方法簽名getDepth隱藏了靜態變量maxdepth。從簽名中刪除:

private static void GetDepth(NodeList nl, int level)

則該方法會奏效。

1

在這部分代碼:

if (maxdepth<level) 
{ 
    maxdepth= level; 
} 

要更新的局部變量MAXDEPTH而不是靜態變量。爲其中一個變量賦予不同的名稱將使其工作,但由於方法的maxdepth參數是不必要的,我只需將其刪除即可。