Java字符串获取最后4个char反向循环

问题描述 投票:-2回答:6

我无法想象如何在零之前获取最新的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();
}

例外:

java.lang.StringIndexOutOfBoundsException
java string revert
6个回答
0
投票

正如评论中提到的,你循环太远了。如果你想访问charAt(i+3),你应该只循环到i < risposta.length() - 3

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

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

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


0
投票

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

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

看看你用来获取角色的值。虽然你的循环仅限于i<risposta.length(),但你在下面的行中使用的i+3不是 - 它可以达到risposta.length()+2。如果oyu想要修复代码,那么将循环条件更改为i+3<risposta.length()

它不优雅,可以做得更好,但这可以解决代码中的直接错误。


0
投票

您的IndexOutOfBoundsException是由以下原因引起的:

risposta.charAt(i + 3)
risposta.charAt(i+2)
risposta.charAt(i+1)

如果你看看你的for循环:

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

}

您正在从索引0迭代到risposta.length() - 1。然而,因为当i+3i时,你在risposta.length() - 1获得了char,它试图访问超出范围的索引risposta.length() + 2

你需要修改你的循环,所以你只能迭代到risposta.length() - 3


0
投票

在这里你有一个班轮!

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


0
投票

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

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

0
投票

首先,StringBuilder有一个反向方法,您可以使用它来反转字符串。这样可以简化逆转。

return new StringBuilder(source).reverse().toString();

正如其他人指出你的for循环可能导致异常,因为它迭代为long。

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

risposta = risposta.replaceFirst("0+$");

然后你可以反转字符串(如上所示)并使用substring方法获得前n个字符。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.