使用Java对数据结构中的字符串值的“点”分隔列表进行排序

时间:2018-09-11 15:19:32

标签: java data-structures

请考虑以下数据集,它是String的列表。 {"20.01","20.01.01","20.01.01.01","20.01.02","20.01.02.01","20.01.02.02","20.02","20.02.01","20.02.01.01","20.02.02","20.02.02.01","20.02.02.02","20.02.02.02.01","20.02.02.02.01.01","20.02.02.02.02","20.02.02.02.03"}

我想使用Java将其组织为基于树的数据结构。我的预期输出将如下所示: 20.01 20.01.01 20.01.01.01 20.01.02 20.01.02.01 20.01.02.02 20.02 20.02.01 20.02.01.01 20.02.02 20.02.02.01 20.02.02.02 20.02.02.02.01 20.02.02.02.01.01 20.02.02.02.02 20.02.02.02.03

2 个答案:

答案 0 :(得分:0)

这里的输入是由我们要构建的树的深度优先遍历生成的标签列表,其中每个标签都描述了节点的完整路径。鉴于此,我们实际需要的只是每个节点的深度,可以通过计算标签中的级别分隔符('.')的数量来获得。

使用此信息,可以使用以下算法构建原始树:

static int buildTree(TreeNode parent, String[] input, int idx)
{
    TreeNode last = null;       
    while(idx < input.length)
    {
        int depth = input[idx].replaceAll("[^.]", "").length();
        if(depth == parent.depth + 1)
        {
            parent.children.add(last = new TreeNode(input[idx++], depth));
        }
        else if(depth > parent.depth + 1)
        {
            idx = buildTree(last, input, idx);
        }
        else break;
    }
    return idx;
}

static class TreeNode
{
    int depth;
    String label;
    List<TreeNode> children;

    TreeNode(String label, int depth)
    {
        this.label = label;
        this.depth = depth;
        children = new ArrayList<>();
    }
}

在提供的输入上进行测试:

public static void main(String[] args)
{
    String[] input = {"20.01","20.01.01","20.01.01.01","20.01.02",
            "20.01.02.01","20.01.02.02","20.02","20.02.01","20.02.01.01",
            "20.02.02","20.02.02.01","20.02.02.02","20.02.02.02.01",
            "20.02.02.02.01.01","20.02.02.02.02","20.02.02.02.03"};

    TreeNode root = new TreeNode("", 0);
    buildTree(root, input, 0);
    print(root.children, "");
}

static void print(Collection<TreeNode> children, String ind)
{
    for(TreeNode n : children) 
    {
        System.out.println(ind + n.label);
        print(n.children, ind + "    ");
    }
}

输出:

20.01
  20.01.01
      20.01.01.01
  20.01.02
      20.01.02.01
      20.01.02.02
20.02
  20.02.01
      20.02.01.01
  20.02.02
      20.02.02.01
      20.02.02.02
          20.02.02.02.01
              20.02.02.02.01.01
          20.02.02.02.02
          20.02.02.02.03

答案 1 :(得分:-2)

你的意思是这样吗?

 public static void main(String[] args){

        String[] str_tb={"20.01","20.01.01","20.01.01.01","20.01.02","20.01.02.01","20.01.02.02","20.02","20.02.01","20.02.01.01","20.02.02","20.02.02.01","20.02.02.02","20.02.02.02.01","20.02.02.02.01.01","20.02.02.02.02","20.02.02.02.03"}

        for(str : str_tb){
            int counter = StringUtils.countMatches(str,".")-1;
            while(counter-- != 0){
                System.out.print("\t");
            }
            System.out.println(str);
        }
    }

我不确定,您指的是“ Java对象”。如果您希望将其打印出来,则将此代码删除即可解决该问题。