如何移除StringBuilder末尾8字符并追加剩余内容到另一个StringBuilder
问题分析
原代码的核心问题在于循环过程中重复追加截取后的字符串,且逻辑顺序混乱:
- 每次遇到数字字符时,都会将当前的
modifiedStr追加到sb,导致当sb2长度超过8后,每处理一个数字就重复添加一次截取结果(比如sb2长度到9时截取得到"1",后续每处理一个数字就追加一次"1",最终出现"117") - 没有等到所有数字收集完成后再统一处理截取,而是边收集边截取追加,逻辑完全错误
修正方案
调整逻辑:先完整遍历原字符串,将非数字字符直接追加到sb,所有数字字符统一收集到sb2;遍历完成后,再从sb2中截取掉末尾8个字符的部分,追加到sb末尾。
修正后的代码如下:
public class Student{ public static void main(String[] args) { String fileNameEdit = "student_1733332211"; StringBuilder sb = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); // 先遍历收集非数字字符和所有数字 for (int i = 0; i < fileNameEdit.length(); i++) { char c = fileNameEdit.charAt(i); if (c >= '0' && c <= '9') { sb2.append(c); } else { sb.append(c); } } // 处理数字部分:移除末尾8个字符,剩余部分追加到sb if (sb2.length() > 8) { String modifiedStr = sb2.substring(0, sb2.length() - 8); sb.append(modifiedStr); } else { // 若数字长度不足8,按需求可选择追加全部或不追加,此处按示例逻辑追加全部 sb.append(sb2); } System.out.println("sb: "+sb); System.out.println("sb2: "+sb2); } }
运行结果
sb: student_17 sb2: 1733332211
如果想更简洁,也可以用字符串正则处理代替循环:
public class Student{ public static void main(String[] args) { String fileNameEdit = "student_1733332211"; // 分离非数字部分和数字部分 String nonDigitPart = fileNameEdit.replaceAll("\\d", ""); String digitPart = fileNameEdit.replaceAll("\\D", ""); StringBuilder sb = new StringBuilder(nonDigitPart); StringBuilder sb2 = new StringBuilder(digitPart); if (digitPart.length() > 8) { sb.append(digitPart.substring(0, digitPart.length() - 8)); } else { sb.append(digitPart); } System.out.println("sb: "+sb); System.out.println("sb2: "+sb2); } }
内容的提问来源于stack exchange,提问作者Akshaya
相关产品推荐
相关产品推荐

