【问题标题】:Java: How to implement Tree structure similar to eclipse package explorer TreeJava:如何实现类似于eclipse包资源管理器Tree的Tree结构
【发布时间】:2013-05-27 04:21:26
【问题描述】:

我有一个存储为字符串表示的方法列表 “com.company.project.service.service1Impl.method()” “com.company.project.service.service2Impl.method()”

....

具有完整的类/包签名

以类似于 Eclipse 包资源管理器的方式实现树结构以显示包/类/方法的最合适方法是什么?

例如:

com
  mycompany
    myproject1
       service
         service1Impl
             method1
             method2
         service2impl
       controller
          controllerImpl
             method1
             method2
          controllerImpl2
    myproject2

注意:

不确定这是否会有所不同,但我计划将此数据结构转换为 json 以将其显示在 UI 中的 jquery 树中。

提前致谢。

【问题讨论】:

    标签: java algorithm data-structures tree


    【解决方案1】:

    我会使用具有以下参数的递归方法来解决它:

    • 包含字符串的数组
    • 当前前缀
    • 当前深度
    • 最大深度(因此只需计算一次)

    我认为解释它的最好方法是使用实​​际代码:

    import java.util.ArrayList;
    
    public class Test {
    
        public static void main(String[] args) {
            Test t = new Test();
            String s1 = "com.company.project.service.service1Impl.method()";
            String s2 = "com.company.project.service.service2Impl.method()";
            String s3 = "com.company.test.service.service1Impl.method()";
            String s4 = "com.company.test.service.service2Impl.method()";
            String[] strings = { s1, s2, s3, s4 };
            t.print(strings);
        }
    
        public void print(String[] strings) {
            //calculate max depth
            int maxDepth = 0;
            for (String string : strings) {
                int currentDepth = string.split("\\.").length;
                if (currentDepth > maxDepth) {
                    maxDepth = currentDepth;
                }
            }
            this.print(strings, "", 0, maxDepth);
        }
    
        public void print(String[] strings, String start, int currentDepth,
                int maxDepth) {
            if (currentDepth == maxDepth - 1) {
                return;
            }
            String currentPrint = null;
            ArrayList<String> candidates = new ArrayList<String>();
    
            // add candidates
            for (String s : strings) {
                if (!s.startsWith(start)) {
                    continue;
                }
                String[] split = s.split("\\.");
                if (split.length - 1 < currentDepth) {
                    continue;
                }
                if (currentPrint == null) {
                    currentPrint = split[currentDepth];
                    candidates.add(currentPrint);
                    continue;
                }
                if (!currentPrint.equals(split[currentDepth])) {
                    currentPrint = split[currentDepth];
                    candidates.add(currentPrint);
                }
            }
    
            // print depth+1 with candidates
            currentDepth++;
            for (String c : candidates) {
                // print current level
                this.printSpaces(currentDepth - 1);
                System.out.println(c);
                // we have to go deeper
                this.print(strings, start + c + ".", currentDepth, maxDepth);
            }
        }
    
        // print spaces
        public void printSpaces(int max) {
            for (int i = 0; i < max; i++) {
                System.out.print("  ");
            }
        }
    }
    

    如果您对代码有任何疑问,请咨询我。

    编辑:这当然只有在方法列表按字母顺序排序时才有效。因此,如果不是这种情况,排序将是第一步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多