【问题标题】:android recursively split string exceptionandroid递归拆分字符串异常
【发布时间】:2014-08-21 06:50:18
【问题描述】:

android 应用可以从 sdcard 加载绝对图片路径,如下图/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完全相同.

我真的很困惑,感觉就像逻辑本身在跟我开玩笑。哎呀

您的任何反馈将不胜感激。

【问题讨论】:

  • "/" + new File(path).getName(); 怎么样?那不就解决问题了吗?
  • 为了保持整洁,请考虑接受答案。

标签: java android string recursion split


【解决方案1】:

您可以像这样轻松使用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:

20130622_200703.jpg

【讨论】:

  • 我希望我能在一开始就想到这个想法!这救了我
  • @LoganGuo - 你会的.. 下一次:)
【解决方案2】:

很多很多方法可以做到这一点,包括你自己的代码的重写版本

// 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 中,你用 subString 做一些事情,但从不返回它,最终还是简单地返回 path。然而,一个简单的return 就足够了:

    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));
}

【讨论】:

  • 如果可以的话,我想为这个提交投票数百万次。非常清晰的答案,给了我很多启发。
【解决方案3】:

使用

String subPath = path.substring(path.lastIndexOf("/"));

而是因为没有理由从一开始就拆分它。

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2011-04-13
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多