Java字符串获取最新的4字符反向循环

Java字符串获取最新的4字符反向循环,java,string,revert,Java,String,Revert,我不知道如何在0之前获得最新的4个字符的字符串 String str = "41f1f3d1f10000000000000000000000000000000000" 我想要:d1f1 我试着还原字符串而不是直接循环 public static boolean checklast4digit(String risposta) { String crc = ""; risposta = reverseIt(risposta); for (int i = 0; i <

我不知道如何在0之前获得最新的4个字符的字符串

String str = "41f1f3d1f10000000000000000000000000000000000"
我想要:
d1f1

我试着还原字符串而不是直接循环

public static boolean checklast4digit(String risposta) {
    String crc = "";
    risposta = reverseIt(risposta);
    for (int i = 0; i < risposta.length(); i++) {
        if (risposta.charAt(i) != '0') crc = Character.toString(risposta.charAt(i + 3)) + Character.toString(risposta.charAt(i + 2)) + Character.toString(risposta.charAt(i + 1)) + Character.toString(risposta.charAt(i)); 
    }
    Log.i("Crc letto: ", crc);
    return true;
}

public static String reverseIt(String source) { //Inversione stringa
    int i, len = source.length();
    StringBuilder dest = new StringBuilder(len);

    for (i = (len - 1); i >= 0; i--) {
        dest.append(source.charAt(i));
    }

    return dest.toString();
}

有很多方法可以改进代码,其中之一就是先删除尾随的零,然后反转剩余的字符串并获取它的前4个字符

但是,要指出代码中的错误


请看一看用于获取字符的值。虽然您的循环仅限于
i,但您的IndexOutOfBoundsException是由以下原因引起的:

risposta.charAt(i + 3)
risposta.charAt(i+2)
risposta.charAt(i+1)
如果您查看for循环:

for(int i=0 ; i < risposta.length(); i++){

}
for(int i=0;i
您正在从索引0迭代到
risposta.length()-1
。但是,由于当
i
risposta.length()-1
时,您在
i+3
处获取字符,因此它尝试访问超出范围的索引
risposta.length()+2


您需要修改循环,以便只迭代到
risposta.length()-3

正如注释中提到的,您的循环太远了。如果您想访问
charAt(i+3)
您应该只循环到
i

此外,一旦找到结果,您需要打破循环:

for(int i=0 ;i < risposta.length() - 3 ;i++){
    if(risposta.charAt(i) != '0') {
        crc= Character.toString(risposta.charAt(i + 3)) + Character.toString(risposta.charAt(i+2)) + Character.toString(risposta.charAt(i+1)) + Character.toString(risposta.charAt(i));
        break;
    } 
}
for(int i=0;i

请注意,如果在零之前有4个非零字符,这只会给出一个结果。

这里有一个单行线

String a = new StringBuilder(new StringBuilder("41f1f3d1f10000000000000000000000000000000000".split("0")[0]).reverse().toString().substring(0, 4)).reverse().toString();
完整的代码如下所示:

package nl.testing.startingpoint;

public class Main {

public static void main(String args[]) {
        String a = new StringBuilder(new StringBuilder("41f1f3d1f10000000000000000000000000000000000".split("0")[0]).reverse().toString().substring(0, 4)).reverse().toString();
        System.out.println(a);
    }
}

结果:d1f1

首先,StringBuilder有一个反向方法,您可以使用它来反向字符串。这将大大简化倒车过程

return new StringBuilder(source).reverse().toString();
正如其他人指出的那样,for循环可能会导致异常,因为它会迭代很长时间

要删除所有尾随零(如CptBartender所建议的),可以使用正则表达式

risposta = risposta.replaceFirst("0+$");
然后可以反转字符串(如上所示),并使用substring方法获取前n个字符

reversed.substring(0, Math.min(reversed.length(), 4));

Math.min()
用于确保在零前少于4个字符时没有错误。

或者,您可以使用
replaceAll
剥离0,然后使用
子字符串获取最后4个字符。这使得代码非常简单:

public static void main(String[] args) {
    String str = "41f1f3d1f10000000000000000000000000000000000";
    str = str.replaceAll("0*$", "");
    System.out.println(str.substring(str.length()-4));
}

risposta.charAt(i+3)
。。。看看这个循环。它在字符串中走了多远?为什么错了?它是所需的四个字符中的一个,它与i+3,i+2,i+1,i when char!=0因为循环可以到达字符串的全部长度,并且您正在尝试访问字符串末尾之外的3个字符,因此错误我忘记了中断命令,谢谢!!它永远不会循环结束,因为char将位于循环的第一个,如果您给它一个开头至少没有4个非零字符的字符串,即使您添加了
break
,如果没有
risposta.length()-3,它仍然会失败。我的版本只会返回一个空字符串,而不是抛出一个错误。超级!谢谢你的在线作品!!
public static void main(String[] args) {
    String str = "41f1f3d1f10000000000000000000000000000000000";
    str = str.replaceAll("0*$", "");
    System.out.println(str.substring(str.length()-4));
}