7

我有一个这样的字符串路径列表:

{“/foo”、“/bar”、“/foo/admin”、“/foo/cust”、“/bar/erp”、“/bar/erp/call”、“/foo/cust/profile”}

如何创建有序字符串树路径?或者我在哪里可以找到一种可以解决我的问题的库?

另一部分,是我想知道如何循环结构以获取我需要的信息(例如,树节点将包含字符串路径,但也可以包含具有路径属性的对象集合),以便您理解需要复杂的数据结构

树可以这样表示:

- /
-- /foo
-- -- /foo/admin
-- -- /foo/cust
-- -- -- /foo/cust/profile
-- /bar
-- -- /bar/erp
-- -- -- /bar/erp/call

谢谢

4

3 回答 3

7

你需要什么:

  1. 从头到尾一次遍历字符串数组 1 的主循环。
  2. 将 /foo/bar/sid 等路径拆分为字符串数组 {'foo','bar','sid'} 的分词器函数。
  3. 树结构(如果您不知道如何在内存中表示树,请查看此 java 操作方法:http: //vivin.net/2010/01/30/generic-n-ary-tree-in-java /但查看独立于语言的指南也会有所帮助,因为它可以让您很好地了解其背后的理论:http: //people.cis.ksu.edu/~schmidt/300s05/Lectures/Week7b。 html ). 树的顶部应该是“根”之类的东西,因为 foo 和 bar 应该都在同一棵树下。

如何一起使用它们:遍历 1. 中的主数组,将每个字符串传递给 2. 中的标记器,一次一个。使用新的标记化字符串遍历树,使用第一个标记作为树的第一级,第二个作为第二级,等等。当您遇到树中不存在的标记时,添加它们。

构建树后,您只需一次遍历一个分支,以回显其内容。

干杯,快乐的编码!

于 2012-07-18T15:08:34.427 回答
3

试试这个:

import java.util.*;

public class Main {
public static void main(String[] args){
    List<String> data = Arrays.asList("/foo", "/bar", "/foo/admin", "/foo/cust", "/bar/erp", "/bar/erp/call", "/foo/cust/profile");

    // order by path
    Collections.sort(data, new Comparator<String>(){
        @Override public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    });

    for (String s : data){
        int length = s.split("/").length - 1; // -1 means.. without empty string
        for (int i=0; i< length; i++){
            System.out.print("-- ");
        }
        System.out.println(s);
    }
}   
}

// 结果是

-- /bar
-- -- /bar/erp
-- -- -- /bar/erp/call
-- /foo
-- -- /foo/admin
-- -- /foo/cust
-- -- -- /foo/cust/profile
于 2012-07-18T15:19:58.370 回答
1

您可以尝试以这种方式将 Comparator 与数组一起使用:

String array[]={"/foo", "/bar", "/foo/admin", "/foo/cust", "/bar/erp", "/bar/erp/call", "/foo/cust/profile"};

Arrays.sort(array,new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});

for(int i=0;i<array.length;i++){
    if(i>0){
        if(array[i].startsWith(array[i-1])){
            System.out.print("\t");
        }
    }
    System.out.println(array[i]);
}
于 2012-07-18T15:24:23.813 回答