2013-05-26 84 views
1

我有一个以字符串表示形式存储的方法列表 “com.company.project.service.service1Impl.method()” “com.company.project .service.service2Impl.method()”Java:如何实现类似于eclipse package explorer的树结构树

....

全类/包签名

什么是实现一个树状结构,以显示包/类最适合的方式/方法与eclipse package explorer类似吗?

例如:

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

注:

如果

不知道这会有所作为,但我正打算到这个数据结构转换成JSON在UI jQuery的树,以显示它。

在此先感谢。

回答

2

我将与具有以下参数的递归方法解决这个问题:

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

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

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(" "); 
     } 
    } 
} 

问我有关代码的任何问题。

编辑:这当然只适用于方法列表是按字母顺序排序的。所以如果情况并非如此,分类将是第一步。