给定两条路径,我如何计算从一条路径到另一条路径的相对路径?
我考虑过使用split
以奇特的方式使用"http://foo.com/bar/baz#header"
,但它似乎有点hacky,尤其是在"http://foo.com/bar/baz"?param=value
或String 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
答案 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)和主机部分可能不同,那么将上面的url1
和url2
转换为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);
}