在Java

时间:2016-08-02 18:41:02

标签: java url relative-path

给定两条路径,我如何计算从一条路径到另一条路径的相对路径?

我考虑过使用split以奇特的方式使用"http://foo.com/bar/baz#header",但它似乎有点hacky,尤其是在"http://foo.com/bar/baz"?param=valueString url1 = "http://foo.com/bar/baz"; String url2 = "http://foo.com/bar/qux/quux/corge"; System.out.println(relative(url1, url2)); // -> "../qux/quux/corge" 等情况下。

一个例子是:

tk

3 个答案:

答案 0 :(得分:4)

Java已经提供此功能,因此最安全的选择是采用"标准"方式:

String url1 = "http://foo.com/bar/baz";
String url2 = "http://foo.com/bar/qux/quux/corge";

Path p1 = Paths.get(url1);
Path p2 = Paths.get(url2);
Path p  = p1.relativize(p2);

System.out.println("Relative path: " + p);

上面的print语句显示了正确的相对路径 - 即,在这种情况下,

../qux/quux/corge

如果协议(例如,http vs https)和主机部分可能不同,那么将上面的url1url2转换为URL个对象and using the getPath() `方法,应该产生正确的相对路径。

答案 1 :(得分:1)

您可以这样做:

public static String relative(String url1, String url2){
    String[] parts = url1.split("/");
    String similar = "";
    for(String part:parts){
        if(url2.contains(similar+part+"/")){
            similar+=part+"/";
        }
    }
    return "./"+url2.replace(similar, "");
}

答案 2 :(得分:1)

无论你使用什么hacky方法,它都必须在引擎盖下循环你的URL。 IndexOf(),split()和其他查找字符的函数仍然具有O(n)运行时,因为它们需要搜索这些字符。所以,你可以编写自己的小“indexOf”样式函数。只需比较每个角色,一次一个,直到找到差异。这标志着你的相同URL的结束,因为我们可以偷偷摸摸地在循环之外声明'i',我们可以退出循环,仍然存储该索引。然后你只需要吐出较长网址的剩余部分!

public String relative (String url1, String url2) {
    int i;
    for(i = 0; i < url1.length(); i++) {
        if(url1.charAt(i) != url2.charAt(i))
            break;
    }
    if(url1.length() > url2.length())
        return url1.substring(i);
    return url2.substring(i);
}