String 从系统字符串列表(文件名)中创建字符串部分的树

String 从系统字符串列表(文件名)中创建字符串部分的树,string,matlab,struct,tree,filenames,String,Matlab,Struct,Tree,Filenames,所以我有一个包含数千个文件的文件夹,所有文件都有系统的名称。我希望用户能够选择一个文件夹,然后将所有文件名从列表(单元格数组)转换为某种树结构。然而,实现如何在Matlab中存储这一点是我陷入困境的地方。这就是我到目前为止所做的: folder = uigetdir; files = dir([folder '\*.nii']); nfiles = length(files); filez = cell(nfiles, 1); for file = 1:nfiles filez(fil

所以我有一个包含数千个文件的文件夹,所有文件都有系统的名称。我希望用户能够选择一个文件夹,然后将所有文件名从列表(单元格数组)转换为某种树结构。然而,实现如何在Matlab中存储这一点是我陷入困境的地方。这就是我到目前为止所做的:

folder = uigetdir;
files = dir([folder '\*.nii']);
nfiles = length(files);

filez = cell(nfiles, 1);
for file = 1:nfiles
    filez(file,:) = cellstr(files(file).name);
end
files = filez;

chars = zeros(nfiles, 1);
for file = 1:nfiles
    chars(file) = length(files{file});
end

filez = files;
names = struct;
for file = 1:nfiles
    curfil = filez{file};
    depth = 0;
    for curchar = 1:chars(file)
        if curchar == 1
            curmatch = strmatch(curfil(1:curchar), filez);
            prevmatch = curmatch;
        else
            prevmatch = curmatch;
            curmatch = strmatch(curfil(1:curchar), filez);
        end
        if length(curmatch) ~= length(prevmatch)
            newnamepart = curfil(1:curchar-1);
            newstructnamepart = ['X' newnamepart]; %This I did because fieldnames must start with characters
            %This is where I dont know how to go on...
        end
    end
end
因此,对于每个文件名,我检查从名称开始的每个部分字符串,其他文件名以相同的字符串开始。如果改变了,我返回一个字符,这应该是树中的第一个节点。然而,我不知道如何创建这样一棵树。Struct在我看来最像这样,但我不确定如何创建此Struct,但也许还有另一种方法?

想法:

  • 把名字排序一次
  • 按名称的第一个字符对单元格数组中的名称进行分组
  • 按每组的第二个字符分组
  • 等等
您还可以使用containers.Map。 不能使用struct,因为字段名必须是常规的MATLAB标识符

function c = group(b, j)
    c = {};
    ch = '';
    for i=1:size(b,1)
        if ~strcmp(b(i,j), ch)
            ch = b(i,j);
            c{end+1} = [];
        end
        c{end}(end+1,:) = b(i,:);
    end

    if j<size(b,2)
        for k=1:length(c)
            c{k} = group(c{k}, j+1);
        end
    end
end

filenames = ['aba'; 'dab'; 'aaa';'abb'];
b=sortrows(filenames);
group(b,1)

ans =
{
  [1,1] =
  {
    [1,1] =
    {
      [1,1] = aaa
    }
    [1,2] =
    {
      [1,1] = aba
      [1,2] = abb
    }
  }
  [1,2] =
  {
    [1,1] =
    {
      [1,1] = dab
    }
  }
}
功能c=组(b,j)
c={};
ch='';
对于i=1:尺寸(b,1)
if~strcmp(b(i,j),ch)
ch=b(i,j);
c{end+1}=[];
结束
c{end}(end+1,:)=b(i,:);
结束

如果你能画一张图表,甚至在一张纸上,并张贴扫描?另外,你能提供一个简单的例子来说明树是如何在特定的文件名上分支的吗?谢谢,很好的综合回答。