Java: как создать дерево Java, упорядоченное по строковому пути

У меня есть список строковых путь такой :

{"С именем/foo", "бар", "с именем/foo/админ", "с именем/foo/потребитель", "/бар/ЕРП", "/бар/системы/ / звонок", "с именем/foo/каст/профиль"}

Как создать путь к строковому дереву ordred? Или где я могу найти своего рода библиотеку, которая может решить мои проблемы?

другая часть заключается в том, что я хочу знать, как зацикливаться на структуре выборки информации, которая мне нужна (e.G узел дерева будет содержать строковый путь, но также может содержать коллекцию объектов с атрибутом path), чтобы вы могли понять, что нужна сложная структура данных

дерево может быть представлено так:

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

спасибо

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

Что нужно:

  1. основной цикл, который перебирает массив строк 1 за раз от начала до конца.
  2. функция токенизатора, которая разбивает путь, такой как /foo/bar/sid, на массив строк {'foo','bar','sid'}.
  3. древовидная структура (если вы не знаете, как представлять деревья в памяти, проверьте этот Java how-to:http://vivin.net/2010/01/30/generic-n-ary-tree-in-java/ но было бы полезно посмотреть на независимое от языка руководство, а также потому, что это даст вам хороший обзор теории за ним:http://people.cis.ksu.edu / ~schmidt/300s05/Lectures/Week7b.html). Вершина вашего дерева должна быть чем-то вроде "корня", поскольку фу и бар должны находиться под одним и тем же деревом.

Как использовать их вместе: Перебрать главный массив в 1. проезжают каждую строку в токенизатор в 2. по одному за раз. Используйте новую строку tokenized, чтобы пройти через дерево, используя первый токен как первый уровень дерева, второй как второй и т. д. при обнаружении маркеров, которые не существуют в дереве, добавьте их.

после построения дерева вы просто повторяете через него ветку за раз, повторяя ее содержимое.

спасибо, и удачи в кодировании!


вы можете попробовать использовать компаратор с массивами таким образом:

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]);
}