如何将字符串NyffsGeyylB转换为指定格式?现有Java代码需修正
问题描述
现有字符串:
String s = "NyffsGeyylB";
需要转换为指定格式的结果:
String result = "N-Yy-Fff-Ffff-Sssss-Gggggg-Eeeeeee-Yyyyyyyy-Yyyyyyyyy-Llllllllll-Bbbbbbbbbbb";
当前代码运行后得到的错误结果:
"N-Yy-Fffffff-Sssss-Gggggg-Eeeeeee-Yyyyyyyyyyyyyyyyy-Llllllllll-Bbbbbbbbbbb"
错误原因
核心问题出在段的合并逻辑:你把所有字符的重复项合并到一个列表后,仅通过字符是否相同来判断是否加分隔符,这会把原字符串中连续的相同字符(比如第3、4位的f,第8、9位的y)对应的独立重复段合并成一个,但需求中每个原字符都要作为独立的段,即使字符相同。
另外,HashMap的遍历顺序不确定(除非用LinkedHashMap),但这不是主要问题,关键是错误地将同字符的不同段合并了。
修改后的代码方案
直接逐个处理原字符串的每个字符,生成对应长度的独立段,再拼接成结果:
String s = "NyffsGeyylB"; StringBuilder finalResult = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); int repeatCount = i + 1; // 每个段的长度等于当前字符的位置序号(从1开始) // 生成单个段:首字母大写,其余小写 StringBuilder segment = new StringBuilder(); segment.append(Character.toUpperCase(c)); for (int j = 1; j < repeatCount; j++) { segment.append(Character.toLowerCase(c)); } // 拼接段,第一个段前不加'-' if (i != 0) { finalResult.append("-"); } finalResult.append(segment); } System.out.println(finalResult.toString());
代码说明
- 遍历原字符串时,每个字符对应一个独立段,段的长度为当前字符的位置序号(从1开始);
- 每个段的格式为「首字符大写 + 剩余长度的小写字符」;
- 用
StringBuilder拼接所有段,除第一个段外,其余段前添加-分隔符; - 运行后直接得到符合需求的结果:
N-Yy-Fff-Ffff-Sssss-Gggggg-Eeeeeee-Yyyyyyyy-Yyyyyyyyy-Llllllllll-Bbbbbbbbbbb
简化版实现(基于原代码结构调整)
如果不想完全重写,也可以先生成所有独立段,再用分隔符连接:
String s = "NyffsGeyylB"; List<String> segments = new ArrayList<>(); // 先生成每个独立段 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); int count = i + 1; StringBuilder sb = new StringBuilder(); sb.append(Character.toUpperCase(c)); for (int j = 1; j < count; j++) { sb.append(Character.toLowerCase(c)); } segments.add(sb.toString()); } // 用'-'连接所有段 String finalResult = String.join("-", segments);
内容的提问来源于stack exchange,提问作者IMBABOT
相关产品推荐
相关产品推荐

