我有一个存储为字符串表示的方法列表
“com.company.project.service.service1impl.method()”
“com.company.project.service.service2impl.method()”
……
具有完整的类/包签名
实现树结构以类似于eclipse package explorer的方式显示包/类/方法的最合适方法是什么?
例如:
com
mycompany
myproject1
service
service1Impl
method1
method2
service2impl
controller
controllerImpl
method1
method2
controllerImpl2
myproject2
注:
不确定这是否会有影响,但我计划将此数据结构转换为json,以便在UI中的jquery树中显示它。
提前谢谢。
最佳答案
我将用一个递归方法来解决它,该方法具有以下参数:
包含字符串的数组
当前前缀
当前深度
最大深度(因此只需计算一次)
我认为最好的解释方法是用实际代码:
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(" ");
}
}
}
问我你对密码有什么问题吗。
编辑:当然,这只在方法列表按字母顺序排序的情况下有效。所以如果不是这样,分类将是第一步。