Write a function that provides change directory (cd) function for an abstract file system.
Notes:
Root path is '/'.
Path separator is '/'.
Parent directory is addressable as "..".
Directory names consist only of English alphabet letters (A-Z and a-z).
For example, new Path("/a/b/c/d").cd("../x").getPath() should return "/a/b/c/x".
Note: The evaluation environment uses '\' as the path separator.
public class Path {
private String path;
public Path(String path) {
this.path = path;
}
public String getPath() {
return path;
}
public Path cd(String newPath) {
//throw new UnsupportedOperationException("Waiting to be implemented.");
String[] newP=newPath.split("/");
String[] oldP=path.split("/");
int lnCount=0;
for(String str:newP){
if(str.equals("..")){
lnCount++;
}
}
int len=oldP.length;
String strOut="";
for(int i=0;i<len-lnCount;i++){
strOut=strOut+oldP[i]+"/";
}
len=newP.length;
for(int i=0;i<len;i++){
if(!newP[i].equals("..")){
strOut=strOut+newP[i]+"/";
}
}
path=strOut.substring(0, strOut.length()-1);
System.out.println(path);
if(path.indexOf("/")<0)
throw new UnsupportedOperationException("Directory not found");
return this;
}
public static void main(String[] args) {
Path path = new Path("/a/b/c/d");
System.out.println(path.cd("../x").getPath());
}
}
Output:
--------------------
/a/b/c/x
Notes:
Root path is '/'.
Path separator is '/'.
Parent directory is addressable as "..".
Directory names consist only of English alphabet letters (A-Z and a-z).
For example, new Path("/a/b/c/d").cd("../x").getPath() should return "/a/b/c/x".
Note: The evaluation environment uses '\' as the path separator.
public class Path {
private String path;
public Path(String path) {
this.path = path;
}
public String getPath() {
return path;
}
public Path cd(String newPath) {
//throw new UnsupportedOperationException("Waiting to be implemented.");
String[] newP=newPath.split("/");
String[] oldP=path.split("/");
int lnCount=0;
for(String str:newP){
if(str.equals("..")){
lnCount++;
}
}
int len=oldP.length;
String strOut="";
for(int i=0;i<len-lnCount;i++){
strOut=strOut+oldP[i]+"/";
}
len=newP.length;
for(int i=0;i<len;i++){
if(!newP[i].equals("..")){
strOut=strOut+newP[i]+"/";
}
}
path=strOut.substring(0, strOut.length()-1);
System.out.println(path);
if(path.indexOf("/")<0)
throw new UnsupportedOperationException("Directory not found");
return this;
}
public static void main(String[] args) {
Path path = new Path("/a/b/c/d");
System.out.println(path.cd("../x").getPath());
}
}
Output:
--------------------
/a/b/c/x
nice soloution but it should be in other languages also Like PHP
ReplyDeleteFor PHP
Deleteclass Path
{
public $currentPath;
function __construct($path)
{
$this->currentPath = $path;
}
public function cd($newPath)
{
$newP = explode('/',$newPath);
$oldP = explode('/', $this->currentPath);
$inCount = 0;
foreach($newP as $str) {
if($str == '..'){
$inCount++;
}
}
$oldLen = count($oldP);
$strOut= '';
for($i=0;$i<($oldLen - $inCount);$i++){
$strOut .=$oldP[$i]."/";
}
$newLen = count($newP);
for($i=0;$i<$newLen;$i++){
if($newP[$i] !='..'){
$strOut = $strOut.$newP[$i].'/';
}
}
$this->currentPath = $strOut;
}
}
display '/a/b/c/x'. ????
DeleteHow about C++?
Delete#include
Delete#include
#include
class Path
{
public:
Path(std::string path)
{
currentPath = path;
}
std::string getPath() const
{
return currentPath;
}
Path cd(std::string newPath) const
{
Path p = *this;
if (newPath == "/")
{
p.currentPath = "/";
return p;
}
while (newPath.size())
{
if (newPath.size() >= 2)
{
if (newPath[0] == '.' && newPath[1] == '.')
{
if (!p.currentPath.empty())
{
p.currentPath.erase(p.currentPath.find_last_of("/\\"));
if (p.currentPath.empty())
{
p.currentPath = "/";
}
}
newPath.erase(0, 2);
continue;
}
}
if (newPath[0] == '/' || newPath[0] == '\\')
{
newPath.erase(0, 1);
if (newPath[0] == '.')
continue;
}
auto i = newPath.find_first_of("/\\");
if (p.currentPath.back() != '/' && p.currentPath.back() != '\\')
{
p.currentPath += "/";
}
p.currentPath += newPath.substr(0, i);
newPath.erase(0, i);
}
return p;
}
private:
std::string currentPath;
};
#ifndef RunTests
int main()
{
Path path("/a/b/c/d");
std::cout << path.cd("../x").getPath();
}
#endif
how about in python
ReplyDelete