路径筛选攻略:从列表中快速定位最大范围路径

描述

根据所提供的路径列表,过滤出其中的最大范围路径

示例一:

路径列表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的一个子路径

  1. 遍历路径列表: 两层遍历路径列表,外层遍历用于筛选最大范围路径(当前路径),内存遍历用于检查外层遍历中的路径是否为最大范围路径(其它路径)。
  2. 检查当前路径:对于每个路径,检查当前路径是否为其他路径的子路径。如果是其它路径的子路径,则说明当前路径不是最大范围路径。
  3. 确认最大路径:直到内层遍历循环完成,就可以确认当前路径是否为最大范围路径。

代码

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);
        }
    }
}
相关推荐
kingx31 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
Dream it possible!3 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
DevOpenClub3 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
心抵鹊3 小时前
算法之双指针系列(一)
算法·leetcode
十二3 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
IT_陈寒4 小时前
Redis雪崩把我坑惨了,这是5年经验的教训
前端·人工智能·后端
量化分析码农4 小时前
【Python量化多因子实战 06】从因子到持仓:多因子选股实盘工程化落地
后端
贾公子4 小时前
检测链路的容量规划——用 Little's Law 算清 QPS、并发与积压
后端·python
kyson_4 小时前
Java 集合框架:从继承体系到数据结构,再到开发选型
后端
露天赏雪4 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel