2017-07-30 175 views
0

我有一个对象类,这是包含了其自身的名单...事情是这样的:我如何遍历嵌套的java对象列表?

public class SearchItemType implements Serializable { 
    protected List<SearchItemType> childItem; 
} 

的childItem也可以conatain孩子的产品清单。我的问题是,我可以遍历所有级别的childItems吗?

现在我的代码如下所示:

public SearchItemType getElementByOpenedRowID(SearchItemType gridResult, String selectedRowId, Boolean found) { 
     SearchItemType element = new SearchItemType(); 

     if (gridResult.getId().equals(selectedRowId)) { 
      element = gridResult; 
      found = true; 
     } 

     for (SearchItemType child : gridResult.getChildItem()) { 
      if (child.getId().equals(selectedRowId)) { 
       element = child; 
       found = true; 
       break; 
      } 
     } 
     if (!found) { 
      for (SearchItemType child : gridResult.getChildItem()) { 
       element = getElementByOpenedRowID(child, selectedRowId, found); 
       checkChildID(child, selectedRowId); 
       if (element != null) break; 
      } 
     } 
     return element; 
    } 

非常感谢。

+0

什么是你显示的代码的问题?它看起来完全符合你想要达到的目标。 –

回答

0

有一个错误:在方法的开始,您可以设置SearchItemType element = new SearchItemType();但当你递归的时候检查nullelement永远不会为空。您可以通过在开始将其设置为null解决这个问题,但我对你的代码的一些建议:

  • 不是指定的发现价值的元素,并设置found标志的,只是尽快返回对象你找到它。在方法结束时返回null。这将更清晰。
  • 即使父母是被搜索的父母,当前仍会执行对子项的迭代并检查它们。事实上,你可以完全移除这个循环,因为它是由下面的递归步骤处理的。
  • 为什么你通过found作为参数?如果你通过它true,那么没有意义,所以如果你真的需要它,只需在方法中实例化它。请确认gridResult不为空。您可以通过getElementByOpenedRowID上的方法SearchItemType来解决此问题,这意味着不需要传递gridResult

应用这些变化将导致:

public SearchItemType getElementByOpenedRowID(SearchItemType gridResult, String selectedRowId) { 
    // stop at null 
    if (gridResult == null) { 
     return null; 
    } 
    if (gridResult.getId().equals(selectedRowId)) { 
     return gridResult; // return once found 
    } 

    // check all of the children 
    for (SearchItemType child : gridResult.getChildItem()) { 
     // do the search again for every child 
     SearchItemType result = getElementByOpenedRowID(child, selectedRowId); 
     if (result != null) { 
      // return once found and sent it all the way to the top 
      return result; 
     } 
    } 
    return null; 
} 
+0

谢谢,工作正常:D – user5562650

0

你可以用递归做到这一点:

public void iterate(SearchItemType type) { 
    // Do something with type 
    for (SearchItemType child in type.childItem) { 
     iterate(child); 
    } 
} 
0

是的,你可以在childItem对象在任何水平,只要迭代作为childItem不是null,对象内部具有非空值。

在LinkedList的数据结构实现LinkedList中的每个节点都有Data字段链接到其他节点(在Java的情况下,它是对其他节点的引用)。

它也被称为自引用对象,它意味着对象指向类似类型的对象。

只要列表中有非空值,您可以在任何级别进行迭代。

Java中的数据结构以类似的方式实现。 在这个代码片段来看Node classLinked List implementation using self referencing pointers

0

您希望通过孩子来迭代递归像这样:

public SearchItemType getElementByOpenedRowID(SearchItemType gridResult, String selectedRowId) { 
    SearchItemType element = null; 
    if (gridResult == null) return null; 
    else if (gridResult.getId().equals(selectedRowId)) return gridResult; 
    else { 
     for (SearchItemType child : gridResult.getChildItem()) { 
      element = getElementByOpenedRowID(child, selectedRowId); 
      if (element != null) break; 
     } 
    } 
    return element; 
}