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; } }
代码逻辑说明
- 初始化列表并先加入完整路径;
- 循环调用
lastIndexOf('/')查找当前路径中最后一个斜杠的位置,仅当位置大于0时(避免截取到单独的/或空字符串)继续; - 截取当前路径到最后一个斜杠之前的部分,加入列表;
- 重复步骤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
相关产品推荐
相关产品推荐

