有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java搜索非二叉树中的任何节点,即使找到多个节点,也保持它们的父节点完好无损

我正在尝试构建一个算法,该算法将根据任何搜索查询搜索树中的一些节点。 例如,在我们的应用程序树中,包含所有节点,包括两个名为角色的节点,一个属于父名称数据,另一个属于父名称系统。现在,如果我提供一个角色搜索条件,则应过滤树,其中两个角色都有其父节点,并删除所有其他节点,如下所示:

 Data
     -> Roles
 System
     -> Roles

我一直在努力得到这样的结果,但用我目前开发的算法

  private TreeNodeDTO filterTree(String search,TreeNodeDTO    
    treeNodeDTO)
  {
    if ( treeNodeDTO.getTitle().equalsIgnoreCase( search ) ) {
        return treeNodeDTO;
    }
    List< TreeNodeDTO > children = treeNodeDTO.getChildren();
    TreeNodeDTO treeNodeDTOResult = null;
        for ( int i = 0; treeNodeDTOResult == null && i <   children.size(); i++ ) {
            treeNodeDTOResult = filterTree( search, children.get( i  ) );
        }
    return treeNodeDTOResult;
  }   

我只得到第一个找到的节点,这不是必需的

Data
 -> Roles

而我需要下面的结果

 Data
     -> Roles
 System
     -> Roles

我还试图修改现有的树结构,以保持对父母和孩子的跟踪,并设置标志以保持对父母的跟踪,但我仍然坚持填充最终结果

这是我的treeNode课程

 public class TreeNodeDTO {

  /** The id. */
  private String id;

 /** The title. */
 private String title;

 /** The children. */
 private List<TreeNodeDTO> children;

 //setters and getters
}

共 (1) 个答案

  1. # 1 楼答案

    我已经修改了您的搜索算法,因此它现在是TreeNodeTo类的成员,这是一种更好的面向对象方法。此外,搜索必须返回如下列表:

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class TreeNodeDTO {
    
        /** The id. */
        private String id;
    
        /** The title. */
        private String title;
    
        /** The children. */
        private List<TreeNodeDTO> children;
    
        private List<TreeNodeDTO> recursiveSearch(String search) {
            if ( getTitle().equalsIgnoreCase( search ) ) {
                return Arrays.asList(this);
            }
            ArrayList<TreeNodeDTO> resultList = new ArrayList<>();
            for (TreeNodeDTO child : getChildren()) {
                resultList.addAll(child.recursiveSearch(search));
            }
            return resultList;
        }
    
        public String getId() {
            return id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public List<TreeNodeDTO> getChildren() {
            return children;
        }
    
    }