Java 获取字符串路径的公共根以及该路径的文件夹列表
我在SQLite3数据库表中存储了如下路径列表:Java 获取字符串路径的公共根以及该路径的文件夹列表,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我在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/folde
/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
我想做的是找到这些路径的公共根,并获得该公共根的第一级文件夹(唯一)列表
比如说
第一次运行:父root=null(这是第一次运行)
公共根目录->/mnt/sdcard/
文件夹列表
-折叠1
-折叠2
第二次运行(现在父根目录为/mnt/sdcard/folder1/)
公共根->/mnt/sdcard/folder1/(与父根相同)
文件夹列表
-a
-e
第二次运行(现在父根目录为/mnt/sdcard/folder1/a/)
公共根->/mnt/sdcard/folder1/a/b(与父根相同)
文件夹列表->空(我将获取文件)
有没有一种方法可以通过db或我必须通过代码来实现这些过滤器
之所以提出这个问题,是因为我需要提供一个Android音乐库的文件夹视图,该视图在song db记录中存储路径。您应该通过代码来完成。
我们这里需要树数据结构。 让我们创建类文件夹
Folder{
List<String> fileList;
List<Folder> folderList;
}
文件夹{
列表文件列表;
列表文件夹列表;
}
现在算法:1.获取列表路径列表中的路径列表
2.使用分隔符“/”拆分列表中的第一个字符串。您将得到一个字符串数组,假设数组中的第一个元素是根文件夹的名称。创建根文件夹。数组中的下一个元素将是子文件夹。最后一个元素将是filename
3.1用于路径列表中的剩余路径。分割每条路径。你会得到数组,比如说array2。现在并行迭代array1和array2,直到找到array1[i]=array2[i]
若发现了不平等性,并且您是array2的最后一个元素,则表示其文件位于现有文件夹中。将其添加到列表中。若您不是最后一个元素,则需要创建文件夹。
这将创建文件夹树。我也必须做同样的事情,但是在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;
}
公共静态字符串GetCommonRoot(参数字符串[]路径)
{
int minDepth=999;
List parsedpath=new List();
foreach(路径中的字符串p)
{
string[]parts=p.Split('\\');
添加(部分);
minDepth=零件。长度
看一看
它是用一些编程语言实现的
这是我测试并用于我的目的的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));
}
}
公共类公共路径{
公共静态字符串commonPath(字符串…路径){
字符串commonPath=“”;
字符串[][]文件夹=新字符串[路径.长度][];
for(int i=0;i
开源Java库提供了一个查找路径的公共目录根的函数
import com.owenfeehan.pathpatternfinder.commonpath.FindCommonPathElements;
Optional<Path> commonPath = FindCommonPathElements.findForFilePaths(paths);
导入com.owenfeehan.pathpatternfinder.commonpath.FindCommonPathElements;
可选commonPath=FindCommonPathElements.FindForFilePath(路径);
它还可以更广泛地用于查找路径中的某些命名模式(数字序列、常量子字符串等)
完全公开:我是库的作者。我不想查询文件系统。我在数据库中有一个路径列表,我想找到一个alg来获取我在问题中询问的信息:)我已经做了“文件系统解决方案”,但它没有优化。明天我会尝试一下,我希望它不会太重,超过5k的歌曲可能会很重。如果你确定路径总是按顺序排列的,你可以尝试一些优化技术。我也在想,也许一个好的解决方案是使用一棵树来实现这样的结构,其中节点是文件夹,叶子是文件(歌曲)。如果你观察到,这个算法只是创建类似树的结构。只是我们不给它命名为树。这里文件夹是节点,文件是叶子。可能会有m