首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 目錄工具類設計:UUID 短碼生成與層級路徑構建

     編輯:程式設計疑難解答

需求分析

構建目錄工具類,要求:

  • 根目錄 /surfs,下含 A/B/C/D 四子目錄。
  • 點擊子目錄判斷是否初始化,未初始化則生成 16 子目錄,遞歸同理。
  • 每目錄擁有唯一 ID,採用短 UUID。
  • 路徑關系:父路徑 abcdefg → 子路徑 abcdefg/cdefg/efg/g(逐級截取)。

核心實現:短 UUID 生成器

利用 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);
    }
}

設計要點

  • 短 UUID:12 字符 Base62,唯一性極高,適合 URL/路徑攜帶。
  • 路徑編碼規則:需與業務方確認具體截取算法,示例展示思路。
  • 線程安全:使用 ConcurrentHashMap 存儲,支持並發訪問。
  • 擴展性:可添加權限、配額、軟刪除等屬性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved