Java 字符串获取最后 4 个字符反向循环
Java string get latest 4 char reverse loop
我不知道如何在零之前获取字符串的最新 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
有很多方法可以改进您的代码,其中之一就是先删除尾随零,然后反转剩余的字符串并取其前 4 个字符。
但是,要指出代码中的错误...
查看您用于获取字符的值。虽然您的循环仅限于 i<risposta.length()
,但您在下面的行中使用的 i+3
不是 - 它可以达到 risposta.length()+2
。如果oyu想修复代码,那么把循环条件改成i+3<risposta.length()
.
它不够优雅,可以做得更好,但这会解决您代码中的直接错误。
您的 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
为 risposta.length() - 1
时,您在 i+3
获取字符,它会尝试访问超出范围的索引 risposta.length() + 2
。
您需要修改循环,这样您最多只能迭代 risposta.length() - 3
如评论中所述,您循环得太过分了。如果你想访问 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 个非零字符,这只会给您一个结果。
给你一个单班机!
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 有一个reverse 方法,你可以用它来反转一个字符串。这会大大简化倒车过程。
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,然后使用 substring
获取最后 4 个字符。这使得代码非常简单:
public static void main(String[] args) {
String str = "41f1f3d1f10000000000000000000000000000000000";
str = str.replaceAll("0*$", "");
System.out.println(str.substring(str.length()-4));
}
我不知道如何在零之前获取字符串的最新 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
有很多方法可以改进您的代码,其中之一就是先删除尾随零,然后反转剩余的字符串并取其前 4 个字符。
但是,要指出代码中的错误...
查看您用于获取字符的值。虽然您的循环仅限于 i<risposta.length()
,但您在下面的行中使用的 i+3
不是 - 它可以达到 risposta.length()+2
。如果oyu想修复代码,那么把循环条件改成i+3<risposta.length()
.
它不够优雅,可以做得更好,但这会解决您代码中的直接错误。
您的 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
为 risposta.length() - 1
时,您在 i+3
获取字符,它会尝试访问超出范围的索引 risposta.length() + 2
。
您需要修改循环,这样您最多只能迭代 risposta.length() - 3
如评论中所述,您循环得太过分了。如果你想访问 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 个非零字符,这只会给您一个结果。
给你一个单班机!
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 有一个reverse 方法,你可以用它来反转一个字符串。这会大大简化倒车过程。
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,然后使用 substring
获取最后 4 个字符。这使得代码非常简单:
public static void main(String[] args) {
String str = "41f1f3d1f10000000000000000000000000000000000";
str = str.replaceAll("0*$", "");
System.out.println(str.substring(str.length()-4));
}