描述
根据所提供的路径列表,过滤出其中的最大范围路径
示例一:
路径列表A如下:
java
[
"/src/main/java/cn/regexp/dailylearningtest/entity/Person.java",
"/doc",
"/src/main/resources/application.properties",
"/src/main/resources"
]
过滤结果为:
java
[
"/src/main/java/cn/regexp/dailylearningtest/entity/Person.java",
"/doc",
"/src/main/resources"
]
路径/src/main/resources
包含了 /src/main/resources/application.properties
示例二:
路径列表B如下:
java
[
"/src/main/java/cn/regexp/dailylearningtest/entity/Person.java",
"/doc",
"/src/main/resources/application.properties",
"/src/main/resources",
"/"
]
过滤结果为:
java
[
"/"
]
路径/
包含了以上所有路径
思路
要实现从一个路径列表中筛选出最大范围路径,可以通过比较路径之间的包含关系来确定最大范围路径。
子路径 :某个路径下面的文件或目录的路径,比如
/src/main/resources/application.properties
是/src/main/resources
的一个子路径
- 遍历路径列表: 两层遍历路径列表,外层遍历用于筛选最大范围路径(当前路径),内存遍历用于检查外层遍历中的路径是否为最大范围路径(其它路径)。
- 检查当前路径:对于每个路径,检查当前路径是否为其他路径的子路径。如果是其它路径的子路径,则说明当前路径不是最大范围路径。
- 确认最大路径:直到内层遍历循环完成,就可以确认当前路径是否为最大范围路径。
代码
java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class PathFilter {
/**
* 过滤出路径列表中的最大范围路径
*
* @param paths 路径列表
* @return 过滤后的最大范围路径列表
*/
public static List<String> filterMaxRangePaths(List<String> paths) {
List<String> result = new ArrayList<>();
// 遍历路径列表
for (String path : paths) {
// 标识路径是否为最大范围
boolean isMaxRange = true;
// 检查当前路径是否是其他路径的子路径
for (String otherPath : paths) {
/*
若当前路径等于其它路径,跳过
若当前路径不等于其它路径,
并且当前路径不包含其它路径,则跳过
并且当前路径包含其它路径,则说明当前路径不是最大范围路径
*/
if (!path.equals(otherPath) && path.startsWith(otherPath)) {
isMaxRange = false;
break;
}
}
// 到了这里,若 isMaxRange 没有被重新赋值,则说明当前路径是最大范围路径,将其添加到结果列表中
if (isMaxRange) {
result.add(path);
}
}
return result;
}
public static void main(String[] args) {
List<String> paths = Arrays.asList("/src/main/java/cn/regexp/dailylearningtest/entity/Person.java", "/doc",
"/src/main/resources/application.properties", "/src/main/resources", "/");
List<String> filteredPaths = filterMaxRangePaths(paths);
for (String filteredPath : filteredPaths) {
System.out.println(filteredPath);
}
}
}