3

次のようなパスのリストを格納するSQLite3データベーステーブルがあります。

/mnt/sdcard/folder1/a/b/file1
/mnt/sdcard/folder1/a/b/file2
/mnt/sdcard/folder1/a/b/file3
/mnt/sdcard/folder1/a/b/file4
/mnt/sdcard/folder1/a/b/file5
/mnt/sdcard/folder1/e/c/file6
/mnt/sdcard/folder2/d/file7
/mnt/sdcard/folder2/d/file8
/mnt/sdcard/file9

私がやりたいのは、これらのパスの共通ルートを見つけて、その共通ルートの第1レベルのフォルダー(一意)のリストを取得することです。

例えば

最初の実行:親ルート= null(最初の実行)共通ルート-> / mnt /sdcard/フォルダーのリスト-folder1-folder2

2回目の実行(現在、親ルートは/ mnt / sdcard / folder1 /になります)共通ルート-> / mnt / sdcard / folder1 /(親ルートと同じ)フォルダーのリスト-a --e

2回目の実行(現在、親ルートは/ mnt / sdcard / folder1 / a /になります)共通ルート-> / mnt / sdcard / folder1 / a / b(親ルートと同じ)フォルダーのリスト->空(ファイルを取得します) )。

これらのフィルターをdbで実行する方法はありますか、それともコードで実行する必要がありますか?

この質問は、曲のデータベースレコードにパスを保存するAndroidミュージックライブラリのフォルダビューを提供する必要があるために行われます。

4

4 に答える 4

3

http://rosettacode.org/wiki/Find_common_directory_pathを見てください。

一部のプログラミング言語で実装されています。

これは、私がテストして目的のために使用した Java の例です。

public class CommonPath {
    public static String commonPath(String... paths){
        String commonPath = "";
        String[][] folders = new String[paths.length][];
        for(int i = 0; i < paths.length; i++){
            folders[i] = paths[i].split("/"); //split on file separator
        }
        for(int j = 0; j < folders[0].length; j++){
            String thisFolder = folders[0][j]; //grab the next folder name in the first path
            boolean allMatched = true; //assume all have matched in case there are no more paths
            for(int i = 1; i < folders.length && allMatched; i++){ //look at the other paths
                if(folders[i].length < j){ //if there is no folder here
                    allMatched = false; //no match
                    break; //stop looking because we've gone as far as we can
                }
                //otherwise
                allMatched &= folders[i][j].equals(thisFolder); //check if it matched
            }
            if(allMatched){ //if they all matched this folder name
                commonPath += thisFolder + "/"; //add it to the answer
            }else{//otherwise
                break;//stop looking
            }
        }
        return commonPath;
    }

    public static void main(String[] args){
        String[] paths = { "/home/user1/tmp/coverage/test",
                 "/home/user1/tmp/covert/operator",
                 "/home/user1/tmp/coven/members"};
        System.out.println(commonPath(paths));

        String[] paths2 = { "/hame/user1/tmp/coverage/test",
                 "/home/user1/tmp/covert/operator",
                 "/home/user1/tmp/coven/members"};
        System.out.println(commonPath(paths2));
    }
}
于 2015-08-24T23:10:17.213 に答える
2

私は同じことをしなければなりませんでしたが、C#で. これが、共通のルート ディレクトリを見つけるための私の解決策です。あなたはそれを適応させることができるはずです。

        public static string GetCommonRoot( params string[] paths )
    {
        int minDepth = 999;
        List<string[]> parsedPaths = new List<string[]>();
        foreach( string p in paths )
        {
            string[] parts = p.Split( '\\' );
            parsedPaths.Add( parts );
            minDepth = parts.Length < minDepth ? parts.Length : minDepth;
        }

        StringBuilder sb = new StringBuilder();
        for( int i = 0; i < minDepth; i++ )
        {
            List<string> tmp = new List<string>();
            foreach( string[] dir in parsedPaths )
            {
                tmp.Add( dir[ i ].ToLower() );
            }

            if( !AllEqual( tmp.ToArray() ) )
                break;

            sb.AppendFormat( "{0}\\", tmp[ 0 ] );
        }

        return sb.ToString();

    }

    private static bool AllEqual( params string[] strings )
    {
        bool rv = true;
        for( int i = 1; i < strings.Length; i++ )
            rv &= strings[ 0 ] == strings[ i ];

        return rv;
    }
于 2012-06-25T16:19:04.090 に答える
1

コードで行う必要があります。
ここではツリーデータ構造が必要です。クラスフォルダを作成しましょう

Folder{
 List<String> fileList;
 List<Folder> folderList;

}

現在のアルゴリズム:
1.List pathList のパスのリストを取得する

2.リストの最初の文字列を区切り文字「/」で分割します。文字列の配列を取得します。たとえば、array1 とします。この配列の最初の要素は、ルート フォルダーの名前になります。ルートフォルダーを作成します。配列の次の要素は subfolder になります。最後の要素はファイル名になります

3.pathList の残りのパス。各パスを分割します。配列を取得します。たとえば、array2 とします。array1[i]!=array2[i] が見つかるまで、array1 と array2 を並列に繰り返します。

不等式が見つかり、最後に array2 の要素になった場合、それは既存のフォルダー内のそのファイルを意味します。リストに追加します。最後の要素ではない場合は、フォルダーを作成する必要があります。これにより、フォルダーのツリーが作成されます。

于 2012-06-06T09:21:46.240 に答える