2013-04-15 39 views
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] 

回答

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)); 
} 
+0

無可厚非接受這是答案,但k [1]並沒有真正的工作..當你有一個字符串像folder1/A/B,k [1]只佔帳戶/ A和om其B .. – sanbhat

+0

謝謝。編輯它 – Jatin

1

可以使用Map<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]}