Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
"/../"
?"/"
.‘/‘
together, such as"/home//foo/"
."/home/foo"
.此题可以用一个堆栈存储每层文件夹或文件,如果两个/之间的内容是".."就弹出栈顶元素,如果遇到“.”或“”就不变。基本思想就是这样。但要考虑一些corner case,如“/../”,"///"等
public String simplifyPath(String path) { //Java // return "/"; path = path.trim(); if(path.equals("/")) return "/"; List<String> stack = new LinkedList<String>(); int top = -1; String tmp = path; while(!tmp.equals("")){ if(tmp.startsWith("/")) tmp = tmp.substring(1); if(tmp.equals("")) break; if(tmp.contains("/")){ int pos = tmp.indexOf("/"); String file = tmp.substring(0,pos); tmp = tmp.substring(pos); if(file.equals(".")|| file.equals("")) continue; if(file.equals("..")){ if(top>-1) top--; continue; } stack.add(++top,file); } else { String file = tmp; tmp = ""; if(file.equals(".")) continue; if(file.equals("..")){ if(top>-1) top--; continue; } stack.add(++top,file); } } //generate path; String rpath = "/"; for(int i = 0; i <=top ; i++) rpath += stack.get(i)+"/"; if(top >=0) rpath = rpath.substring(0,rpath.length()-1); return rpath; }
原文地址:http://blog.csdn.net/chenlei0630/article/details/41910703