7

次のような文字列パスのリストがあります。

{"/foo", "/bar", "/foo/admin", "/foo/cust", "/bar/erp", "/bar/erp/call", "/foo/cust/profile"}

順序付けられた文字列ツリー パスを作成するには? または、問題を解決できるライブラリはどこにありますか?

もう1つの部分は、構造に対してループして必要な情報を取得する方法を知りたいということです(たとえば、ツリーノードには文字列パスが含まれますが、パス属性を持つオブジェクトのコレクションも含まれる可能性があります)。複雑なデータ構造が必要であること

ツリーは次のように表すことができます。

- /
-- /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 は両方とも同じツリーの下にある必要があるため、ツリーのトップは「root」のようなものにする必要があります。

これらを一緒に使用する方法: 1. のメイン配列を繰り返し処理し、各文字列を 2. のトークナイザーに一度に 1 つずつ渡します。新しいトークン化された文字列を使用して、最初のトークンをツリーの最初のレベルとして使用し、2 番目のトークンを 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 with Arrays を試すことができます:

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 に答える