2013-06-04 211 views
0

我想在recursivly build itemlist中找到一個名字。 項目可以有子項目可以有子項目等遞歸名稱搜索

它的第一級工作。對於更深的層次,正確找到的名稱/ ID映射會從堆棧中覆蓋。由於字符串結果,我必須在最後寫入return語句。所以我有一個心理障礙,我可以如何解決這個問題。我很感謝你的幫助。

public String getNameForID(List<Item> top, long id, String name) { 

     for (Item i : top) { 
      if (i.getId() == id) { 
       name = i.getName(); 
       return name; 
      }else{ 
      this.getNameForID(i.getSubItemsList(), id,name); 
      } 

     } 
     return name; 
    } 

回答

1

這必須是你在找什麼:

public String getNameById(List<Item> items, long id) { 
    // boundary condition 
    if (items == null || items.isEmpty()) { 
     return null; 
    } 
    // looping 
    for (Item item : items) { 
     // if current is 
     if (item.getId() == id) { 
      return item.getName(); 
     } 
     // recursion 
     String name = getNameById(item.getSubItemsList(), id); 
     // if nested found 
     if (name != null) { 
      return name; 
     } 
    } 
    // boundary condition 
    return null; 
} 
+0

感謝;)它的工作 – Siser

0

你不指定返回值這裏

this.getNameForID(i.getSubItemsList(), id,name); 

其實你並不需要參數名稱 - 僅返回名稱null每次調用

1

您遞歸調用getNameForID必須也能夠返回一個值。它還需要能夠指示未找到值,以便遞歸終止。

基於@ sp00m對以前刪除(稍不正確)的答案,試試這個:

public String getNameById(List<Item> items, long id) { 

    // sanity checking conditions to terminate recursion early 
    if (items == null || items.isEmpty()) { 
     return null; 
    } 

    // iterate over collection 
    for (Item item: items) { 
     if (item.getId() == id) { 
      return item.getName(); 
     } else { 
      String name = getNameById(item.getSubItemsList(), id); 
      if (name != null) { 
       return name; 
      } 
     } 
    } 

    // final termination condition - entry wasn't in this list 
    return null; 
} 
+0

這是錯的,我編輯。 – sp00m

+0

@ sp00m所以你沒有 - 我發現你的原始錯誤,並在這裏發佈了一個修正版本。取消刪除你的內容,我會加註它。 – Alnitak