如何实现树的分层模糊查找,比如给定String str和int layer,如果存在模糊等于该值的节点就选中该节点否则返回null
其中layer为在第layer层节点中查找

解决方案 »

  1.   

    知道是要用到递归,可是我还是不会,有空帮我看看吧,我把例子拷贝上。
    请补全方法findTree(String str,int layer);
    package pkg;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.tree.*;
    public class MainFrm extends JFrame {
      private JPanel jContentPanel = null;
      private JSplitPane jSplitPane = null;
      private JPanel jPanelLeft = null;
      private JScrollPane jScrollPane = null;
      private JPanel jPanelRight = null;
      private JTextField jTextField = null;
      private JTree jTree = null;
      private JButton jButton = null;
      public MainFrm(){
        super();
        init();
      }
      private void init(){
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setExtendedState(MAXIMIZED_BOTH);
    this.setContentPane(getJContentPanel());
    this.setTitle("查找树中节点的例子");
      }
      private JPanel getJContentPanel(){
    if(jContentPanel == null){
      jContentPanel = new JPanel();
      jContentPanel.setLayout(new BorderLayout());
      jContentPanel.add(getJSplitPane(),BorderLayout.CENTER);
    }
    return jContentPanel;
      }
      private JSplitPane getJSplitPane(){
    if(jSplitPane == null){
    jSplitPane = new JSplitPane();
    jSplitPane.setDividerLocation(200);
    jSplitPane.add(getJPanelLeft(),JSplitPane.LEFT);
    jSplitPane.add(getJPanelRight(),JSplitPane.RIGHT);
    }
    return jSplitPane;
      }
      private JPanel getJPanelLeft(){
    if(jPanelLeft == null){
      jPanelLeft = new JPanel();
      jPanelLeft.setLayout(new BorderLayout());
      jPanelLeft.add(getJScrollPane(),BorderLayout.CENTER);
    }
    return jPanelLeft;
      }
      private JScrollPane getJScrollPane(){
    if(jScrollPane == null){
      jScrollPane = new JScrollPane();
      jScrollPane.setViewportView(getJTree());
    }
    return jScrollPane;
      }
      private JTree getJTree(){
      if(jTree == null){
      jTree = new JTree();
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
      for(int i=0;i<10;i++){
      DefaultMutableTreeNode second = new DefaultMutableTreeNode(Integer.toString(i));
      root.add(second);
      for(int j=5*i+10;j<5*i+15;j++){
      DefaultMutableTreeNode third = new DefaultMutableTreeNode(Integer.toString(j));
      second.add(third);
      }
      }
      DefaultTreeModel model = new DefaultTreeModel(root);
      jTree.setModel(model);   
      }
      return jTree;
      }
      private JPanel getJPanelRight(){
    if(jPanelRight == null){
    jPanelRight = new JPanel();
    jPanelRight.add(getJTextField());
    jPanelRight.add(getJButton());
    }
    return jPanelRight;
      }
      private JTextField getJTextField(){
      if(jTextField == null){
      jTextField = new JTextField();
      jTextField.setText("asdfdsfs");
      }
      return jTextField;
      }
      private JButton getJButton(){
      if(jButton == null){
      jButton = new JButton("查找");
      jButton.addMouseListener(new MouseAdapter(){
      public void mouseClicked(MouseEvent e){
      findTree("55",2);
      }
      });
      }
      return jButton;
      }
      //这里需要你添加--〉查找节点的方法
      private void findTree(String str,int layer){
      
      }
      public static void main(String[] args){
    MainFrm application = new MainFrm();
    application.show();
      }
    }
      

  2.   

    问一下:findTree("55",2);  --------> 只在第二层找吗?如果只在某一层找,也许可以不用递归,说不准
      

  3.   

    是的,是只在第二层查找,你说的递归是在全书查找,在某层如何做到呢?
    归根我现在有两个1、如何找jtree的某层,又没有现成的方法;2、.equal为相等,模糊等于又没有方法;
    感谢 trumplet(检查) 对本贴的关注!
    以下为递归全树查找方法,网上找的,应该没有问题:
    private TreePath findInPath(TreePath treePath, String str){
        Object object = treePath.getLastPathComponent();
        if (object == null) 
        {
          return null;
        }
        String value = object.toString();
        if (str.equals(value)) 
        {
          return treePath;
        }
        else 
        {
          TreeModel model = tree.getModel();
          int n = model.getChildCount(object);
          for (int i = 0; i < n; i++) 
          {
            Object child = model.getChild(object, i);
            TreePath path = treePath.pathByAddingChild(child);
            path = findInPath(path, str);
            if (path != null) 
            {
            return path;
            }
          }
        return null;
        }
      }
      

  4.   

    关于第一点,提点思路:先在全树上找,再用按 TreeNode.getLevel()+1 筛选所感兴趣的层。模糊查找我也不会,如果节点上不是String,而是某种类,似乎会更难办一些。
      

  5.   

    就是想你说的用TreeNode.getLevel,来判断一下就好了!
    至于模糊就是用判断该字符串是否为子字串
      

  6.   

    模糊查找要看你是要实现何种级别的模糊,如果是最简单的子串判断,String类就可以了,如果复杂点,要支持*等特殊符号,就要用到正则表达式了
      

  7.   

    chaosking(穷人脸) 我还没有搞到那么麻烦,不过确实是应该多看看了,赞,有空多向大家学习