我需要检查给定路径是否是另一条路径中任何地方的子路径,并且在编写自己的路径之前想知道是否存在这样的方法。
以下是一些可能有助于理解问题的代码:
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
中的许多方法看起来好像这个功能必须已经在那里。也许我只是没有看到它。
答案 0 :(得分:0)
我想出的是以下内容:
BiPredicate<Path, Path> containsSubPath =
(someRealPath, subPathToCheck) -> someRealPath.normalize()
.toString()
.contains(subPathToCheck.normalize()
.toString())
这样我就可以打电话:
containsSubPath.test(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path"));
正如ThomasKläger所指出的,这个解决方案也匹配路径,它们只是真实路径的子串(对我的用例来说也可以)。
这是另一个可能更正确的解决方案(对于完全匹配的子路径),但仍然没有我想要的那么短:
BiPredicate<Path, Path> containsSubPath = (realPath, subPath) -> {
Iterator<Path> realPathIterator = realPath.normalize().iterator();
Iterator<Path> subPathIterator = subPath.normalize().iterator();
while (realPathIterator.hasNext()) {
Path realPathSegment = realPathIterator.next();
if (subPathIterator.hasNext()) {
Path subPathSegment = subPathIterator.next();
if (!Objects.equals(realPathSegment, subPathSegment)) {
subPathIterator = subPath.normalize().iterator();
}
} else {
break;
}
}
return !subPathIterator.hasNext();
};
具有预期输出的示例调用:
containsSubPath.test(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path")) // true
containsSubPath.test(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("me/pa")) // false