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 за раз от начала до конца.
- функция токенизатора, которая разбивает путь, такой как /foo/bar/sid, на массив строк {'foo','bar','sid'}.
- древовидная структура (если вы не знаете, как представлять деревья в памяти, проверьте этот 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]);
}