構建目錄工具類,要求:
/surfs,下含 A/B/C/D 四子目錄。abcdefg → 子路徑 abcdefg/cdefg/efg/g(逐級截取)。利用 Base62 編碼壓縮標準 UUID(32 字符 → 12 字符):
public class DirIdGenerator {
private static final String[] CHARS = {
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"0","1","2","3","4","5","6","7","8","9",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
}; // 62 字符
public static String generateShortUuid() {
String uuid = UUID.randomUUID().toString().replace("-", ""); // 32 hex
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 12; i++) {
// 每 3 位 hex (12bit) 映射一個 Base62 字符
String sub = uuid.substring(i * 3, i * 3 + 3);
int x = Integer.parseInt(sub, 16);
sb.append(CHARS[x % 62]); // 0x3E = 62
}
return sb.toString(); // 12 字符短碼
}
}
public class Directory {
private String id; // 短 UUID
private String name; // 目錄名
private String path; // 完整路徑
private boolean initialized; // 是否初始化子目錄
private List<Directory> children;
// getter/setter/構造器
}
public class DirectoryService {
private static final String ROOT_PATH = "/surfs";
private Map<String, Directory> dirMap = new ConcurrentHashMap<>(); // path -> Directory
public Directory getOrCreateRoot() {
return dirMap.computeIfAbsent(ROOT_PATH, p -> {
Directory root = new Directory();
root.setId(DirIdGenerator.generateShortUuid());
root.setName("surfs");
root.setPath(ROOT_PATH);
return root;
});
}
public List<Directory> clickDirectory(String parentPath) {
Directory parent = dirMap.get(parentPath);
if (parent == null) throw new IllegalArgumentException("父目錄不存在");
if (!parent.isInitialized()) {
// 初始化:生成 16 子目錄
List<Directory> children = new ArrayList<>();
for (int i = 0; i < 16; i++) {
String childName = "sub" + i;
String childPath = buildChildPath(parent.getPath(), childName);
Directory child = new Directory();
child.setId(DirIdGenerator.generateShortUuid());
child.setName(childName);
child.setPath(childPath);
children.add(child);
dirMap.put(childPath, child);
}
parent.setChildren(children);
parent.setInitialized(true);
}
return parent.getChildren();
}
// 路徑構建規則:父路徑 abcdefg -> 子路徑 abcdefg/cdefg/efg/g
private String buildChildPath(String parentPath, String childName) {
// 示例邏輯:取父路徑最後一段作為基礎
String[] parts = parentPath.split("/");
String last = parts[parts.length - 1];
// 實際業務規則需確認,此處演示逐級截取
return parentPath + "/" + last.substring(1) + "/" + last.substring(2) + "/" + last.substring(3);
}
}
ConcurrentHashMap 存儲,支持並發訪問。