gpt4 book ai didi

java.nio.file.Path.contains(subPath)?

转载 作者:行者123 更新时间:2023-12-02 05:12:49 28 4
gpt4 key购买 nike

我需要检查给定路径是否是另一个路径中任何位置的子路径,并且想知道在编写自己的方法之前是否已经存在这样的方法。

下面是一些可能有助于理解问题的代码:

Path someRealPath = Paths.get("/tmp/some/path/to/somewhere");
Path subpathToCheck = Paths.get("some/path");

// I am expecting something similar as follows:
someRealPath.contains(subPathToCheck) // should return true in this case
someRealPath.contains(Paths.get("some/to")) // should return false

我已经看到了relativize,但我认为这不是解决问题的最简单方法。我想出的最简单的方法是 normalize().toString().contains(/* other normalized string path */)。但也许有更简单的方法? Paths 中的许多方法看起来好像该功能已经存在。也许我只是没有看到它。

最佳答案

我的想法如下:

boolean containsSubPath(Path someRealPath, Path subPathToCheck) {
return someRealPath.normalize()
.toString()
.contains(subPathToCheck.normalize()
.toString());
}

这样我就可以调用:

containsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path"));

正如 Thomas Kläger 指出的那样,该解决方案还匹配路径,这些路径只是真实路径的子字符串(对于我的用例来说也可以)。

这是另一个可能更正确的解决方案(对于完整匹配的子路径),但仍然没有我希望的那么短(现在由于 Kabhals 输入而得到纠正):

static boolean containsSubPath(Path realPath, Path subPath) {
for (Path realPathSegment : realPath.normalize()) {
if (containsSubPath(realPathSegment.iterator(), subPath.normalize().iterator())) {
return true;
}
}
return false;
}
private static boolean containsSubPath(Iterator<Path> realPathIterator, Iterator<Path> subPathIterator) {
var hasEntries = realPathIterator.hasNext() && subPathIterator.hasNext();
while (realPathIterator.hasNext() && subPathIterator.hasNext()) {
Path realPathSegment = realPathIterator.next();
Path subPathSegment = subPathIterator.next();
if (!Objects.equals(realPathSegment, subPathSegment))
return false;
}
return hasEntries;
}

具有预期输出的示例调用:

containsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path")) // true
containsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("me/pa")) // false

如果您需要将其用作BinaryOperator,只需使用方法引用,即YourClass::containsSubPath

关于java.nio.file.Path.contains(subPath)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42903373/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com