You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何提取字符串路径的所有逆向子路径组合?

提取路径的所有逆向子路径(Java实现)

给定路径字符串 /some/path/aaa/bbb/ccc/ddd,我们需要提取从完整路径到最顶层父路径的所有逆向子路径,最终得到如下列表:

["/some/path/aaa/bbb/ccc/ddd", "/some/path/aaa/bbb/ccc", "/some/path/aaa/bbb", "/some/path/aaa", "/some/path", "/some"]

最优实现:使用lastIndexOf循环截取

这种方案无需拆分路径为数组,直接在原字符串上通过查找最后一个斜杠的位置进行截取,内存开销更小,执行效率更高,尤其适合长路径场景。

完整代码示例:

import java.util.ArrayList;
import java.util.List;

public class PathExtractor {
    private static String EXAMPLE = "/some/path/aaa/bbb/ccc/ddd";

    public static void main(String[] args) {
        List<String> allPossibleSubpathInReverseOrder = getAllPossibleSubpathInReverseOrder(EXAMPLE);
        System.out.println(allPossibleSubpathInReverseOrder);
    }

    private static List<String> getAllPossibleSubpathInReverseOrder(String fullPath) {
        List<String> subpaths = new ArrayList<>();
        String currentPath = fullPath;
        // 先添加完整路径
        subpaths.add(currentPath);
        
        // 循环查找最后一个斜杠(跳过开头的根斜杠)
        int lastSlashIndex;
        while ((lastSlashIndex = currentPath.lastIndexOf('/')) > 0) {
            // 截取到最后一个斜杠之前的部分
            currentPath = currentPath.substring(0, lastSlashIndex);
            subpaths.add(currentPath);
        }
        return subpaths;
    }
}

代码逻辑说明

  1. 初始化列表并先加入完整路径;
  2. 循环调用lastIndexOf('/')查找当前路径中最后一个斜杠的位置,仅当位置大于0时(避免截取到单独的/或空字符串)继续;
  3. 截取当前路径到最后一个斜杠之前的部分,加入列表;
  4. 重复步骤2-3,直到找不到符合条件的斜杠,最终返回列表。

对比split()实现方式

如果使用split(),需要先将路径拆分为字符串数组,再通过多次拼接生成子路径,这种方式会额外占用数组内存,且拼接过程的时间开销更高。示例代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class SplitPathExtractor {
    private static String EXAMPLE = "/some/path/aaa/bbb/ccc/ddd";

    public static void main(String[] args) {
        List<String> subpaths = getAllPossibleSubpathWithSplit(EXAMPLE);
        System.out.println(subpaths);
    }

    private static List<String> getAllPossibleSubpathWithSplit(String fullPath) {
        List<String> subpaths = new ArrayList<>();
        // 拆分路径,过滤空字符串(处理开头的斜杠)
        List<String> validParts = Arrays.stream(fullPath.split("/"))
                .filter(part -> !part.isEmpty())
                .collect(Collectors.toList());
        
        // 从完整路径开始,逐个减少末尾部分生成子路径
        for (int j = validParts.size(); j > 0; j--) {
            StringBuilder sb = new StringBuilder();
            for (int k = 0; k < j; k++) {
                sb.append("/").append(validParts.get(k));
            }
            subpaths.add(sb.toString());
        }
        return subpaths;
    }
}

显然,lastIndexOf的实现方式更简洁高效,是更优的选择。

内容的提问来源于stack exchange,提问作者PatPanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:52:21