我需要检查给定的路径是否是另一个路径中任何位置的子路径,并且想知道在编写我自己的方法之前是否已经存在这样的方法。
下面是一些可能有助于理解问题的代码:
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
Run Code Online (Sandbox Code Playgroud)
我已经看到了relativize,但我认为这不是解决问题的最简单方法。我想出的最简单的是normalize().toString().contains(/* other normalized string path */). 但也许有更简单的方法?里面的很多方法Paths看起来好像这个功能一定已经在那里了。也许我只是没有看到它。
我想出的是以下内容:
\nboolean containsSubPath(Path someRealPath, Path subPathToCheck) {\n return someRealPath.normalize()\n .toString()\n .contains(subPathToCheck.normalize()\n .toString());\n}\nRun Code Online (Sandbox Code Playgroud)\n这样我就可以调用:
\ncontainsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path"));\nRun Code Online (Sandbox Code Playgroud)\n正如 Thomas Kl\xc3\xa4ger 指出的那样,该解决方案还匹配路径,这些路径只是真实路径的子字符串(对于我的用例来说也可以)。
\n这是另一个可能更正确的解决方案(对于完整匹配的子路径),但仍然没有我希望的那么短(现在由于 Kabhals 输入而得到纠正):
\nstatic boolean containsSubPath(Path realPath, Path subPath) {\n for (Path realPathSegment : realPath.normalize()) {\n if (containsSubPath(realPathSegment.iterator(), subPath.normalize().iterator())) {\n return true;\n }\n }\n return false;\n}\nprivate static boolean containsSubPath(Iterator<Path> realPathIterator, Iterator<Path> subPathIterator) {\n var hasEntries = realPathIterator.hasNext() && subPathIterator.hasNext();\n while (realPathIterator.hasNext() && subPathIterator.hasNext()) {\n Path realPathSegment = realPathIterator.next();\n Path subPathSegment = subPathIterator.next();\n if (!Objects.equals(realPathSegment, subPathSegment))\n return false;\n }\n return hasEntries;\n}\nRun Code Online (Sandbox Code Playgroud)\n具有预期输出的示例调用:
\ncontainsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path")) // true\ncontainsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("me/pa")) // false\nRun Code Online (Sandbox Code Playgroud)\n如果您需要使用它,BinaryOperator只需使用方法引用即可,即YourClass::containsSubPath.
| 归档时间: |
|
| 查看次数: |
2306 次 |
| 最近记录: |