Java android递归拆分字符串异常
android应用程序可以从SD卡加载绝对图像路径,如下所示Java android递归拆分字符串异常,java,android,string,recursion,split,Java,Android,String,Recursion,Split,android应用程序可以从SD卡加载绝对图像路径,如下所示/storage/sdcard0/DCIM/Camera/20130622_200703.jpg 我只需要部分路径字符串,如/20130622_200703.jpg 所以我想递归地将绝对路径分割成我需要的路径。我写的代码如下 public String splitPath(String path){ if (path == "") { return null; } if(path.indexOf
/storage/sdcard0/DCIM/Camera/20130622_200703.jpg
我只需要部分路径字符串,如/20130622_200703.jpg
所以我想递归地将绝对路径分割成我需要的路径。我写的代码如下
public String splitPath(String path){
if (path == "") {
return null;
}
if(path.indexOf("/") != -1){
String subPath = path.substring(path.indexOf("/") + 1);
//absoultePath = subPath;
splitPath(subPath);
}
return path;
}
但问题是当我在调试模式下跟踪流程时。路径可以从/…/…/…/…/…/…
拆分为/…
,这是正确的,但即使path.indexOf(“/”)
等于-1
,它也不会返回路径
然后奇怪的事情发生了,递归循环没有结束,它继续一步一步地将/…
更改为/…/…/…/…/…/…/…
,在这个过程之后,它返回的路径与/storage/sdcard0/DCIM/Camera/20130622_200703.jpg
的值完全相同
我真的很困惑,这感觉就像是逻辑本身在跟我开玩笑。哎呀
您的任何反馈都将不胜感激。您可以像这样轻松地使用
split()
:
public static void main(String a[]) {
String s = "/storage/sdcard0/DCIM/Camera/20130622_200703.jpg";
String[] arr = s.split("/");
System.out.println(arr[arr.length - 1]);
}
O/p:
您可以像这样轻松地使用
split()
:
public static void main(String a[]) {
String s = "/storage/sdcard0/DCIM/Camera/20130622_200703.jpg";
String[] arr = s.split("/");
System.out.println(arr[arr.length - 1]);
}
O/p:
使用
相反,因为没有理由从头开始分割它。使用
取而代之的是,没有理由从一开始就将其拆分。有很多方法可以做到这一点,包括您自己的代码的重写版本
// making use of lastIndexOf
String subPath = path.substring(path.lastIndexOf("/"));
// make use of file class
String subPath = new File(path).getName();
// make use of String split
String[] parts = path.split("/");
String subPath = parts[parts.length - 1];
// modification on your own code
public static String splitPath(String path) {
int index = path.indexOf("/");
if (index == -1)
return path;
else
return splitPath(path.substring(index + 1));
}
对代码的考虑
public String splitPath(String path){
if (path == "") {
return null;
}
if(path.indexOf("/") != -1){
String subPath = path.substring(path.indexOf("/") + 1);
splitPath(subPath);
}
return path;
}
您可以对字符串执行==
。永远不要那样做。假设您调用splitPath(“a/b”)
,则跳过第一个if,第二个if不是,但在第二个if中,您使用子字符串执行某些操作,但从未返回它,最终只返回path
。但是,一个简单的返回就足够了:
if(path.indexOf("/") != -1){
String subPath = path.substring(path.indexOf("/") + 1);
return splitPath(subPath); //note the return.
}
return path;
其结果是:
public String splitPath(String path) {
int index = path == null ? -1 : path.indexOf("/"); // null check
if (index != -1)
return splitPath(path.substring(index + 1));
return path;
//or :
// int index = path == null ? -1 : path.indexOf("/"); // null check
// return index == -1 ? path : splitPath(path.subString(index + 1));
}
有很多很多方法可以做到这一点,包括您自己的代码的重写版本
// making use of lastIndexOf
String subPath = path.substring(path.lastIndexOf("/"));
// make use of file class
String subPath = new File(path).getName();
// make use of String split
String[] parts = path.split("/");
String subPath = parts[parts.length - 1];
// modification on your own code
public static String splitPath(String path) {
int index = path.indexOf("/");
if (index == -1)
return path;
else
return splitPath(path.substring(index + 1));
}
对代码的考虑
public String splitPath(String path){
if (path == "") {
return null;
}
if(path.indexOf("/") != -1){
String subPath = path.substring(path.indexOf("/") + 1);
splitPath(subPath);
}
return path;
}
您可以对字符串执行==
。永远不要那样做。假设您调用splitPath(“a/b”)
,则跳过第一个if,第二个if不是,但在第二个if中,您使用子字符串执行某些操作,但从未返回它,最终只返回path
。但是,一个简单的返回就足够了:
if(path.indexOf("/") != -1){
String subPath = path.substring(path.indexOf("/") + 1);
return splitPath(subPath); //note the return.
}
return path;
其结果是:
public String splitPath(String path) {
int index = path == null ? -1 : path.indexOf("/"); // null check
if (index != -1)
return splitPath(path.substring(index + 1));
return path;
//or :
// int index = path == null ? -1 : path.indexOf("/"); // null check
// return index == -1 ? path : splitPath(path.subString(index + 1));
}
怎么样“/”+新文件(路径).getName()代码>?这能解决问题吗?保持干净整洁,考虑接受一个答案。<代码>“/”+新文件(PATH).GETNAMEL():<代码>?这不会解决问题吗?保持干净整洁,考虑接受一个答案。我希望我能在一开始就想到这个主意。省钱me@LoganGuo-你会的。。下一次:)我真希望我一开始就考虑过这个想法!省钱me@LoganGuo-你会的。。下一次:)如果可以的话,我想投票支持这个承诺一百万次。答案非常清楚,给了我很多启发。如果可以的话,我想投票支持这个承诺一百万次。答案非常清楚,给了我很多启发。