0

如果我有这样的路径文本列表:

folder1/A
folder1/B/H
folder1/C/F
folder2/D
folder2/E
folder2/F
folder3/G
folder3/H
folder3/I

按第一个目录对它们进行分组的最佳方法是什么?

像这样的输出:

folder1 [A, B/H, C/F]
folder2 [D, E, F]
folder3 [G, H, I]
4

2 回答 2

1

你可以使用 aMap<String, List<String>>来做到这一点。

  1. 首先逐行读取文件(使用BufferedReader或等效)
  2. 使用拆分字符串"/"并获取主文件夹(在您的情况下folder1, folder2
  3. 主文件夹作为添加到map,如果键存在,则获取值List<String>并添加路径(即B/H, A等)

编辑:完整列表

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ParseFolders {

    public static Map<String, List<String>> parse(List<String> input) {
        Map<String, List<String>> res = new HashMap<String, List<String>>();

        for(String s : input) {
            String [] arr = s.split("/");
            String key = arr[0];
            String val = s.substring(s.indexOf("/"));
            if(res.containsKey(key)) {
                res.get(key).add(val);
            }
            else {
                List<String> folders = new ArrayList<String>();
                folders.add(val);
                res.put(key, folders);
            }
        }
        return res;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<String> input = new ArrayList<String>();
        input.add("folder1/A");
        input.add("folder1/B/H");
        input.add("folder1/C/F");
        input.add("folder2/D");
        input.add("folder2/E");
        input.add("folder2/F");
        input.add("folder3/G");
        input.add("folder3/H");
        input.add("folder3/I");

        System.out.println(parse(input));
    }

}

和输出

{folder1=[/A, /B/H, /C/F], folder3=[/G, /H, /I], folder2=[/D, /E, /F]}
于 2013-04-15T13:11:06.720 回答
1

假设您有一个字符串列表ls作为包含所有字符串的输入:

Map<String, List<String>> map = new HashMap<>();
for(String s: ls){
  String[] k = s.split("/");
  if(k.length<2)
     throw new RuntimeException("Invalid input");
  if(map.get(k[0]==null)
     map.put(k[0], new ArrayList<String>());
  map.get(k[0]).add(Arrays.asList(Arrays.copy(k,1,k.length));
}
于 2013-04-15T13:14:03.707 回答