Java中如何避免硬编码数组索引,动态构建目标HTML字符串?
如何避免硬编码数组索引生成指定结构的HTML字符串
我有一段Java代码,通过分隔符拆分字符串得到4个元素的数组,想要生成如下结构的HTML字符串:
result = "<div class=\"parent\"> <div class=\"heading\">"+arr[0]+"</div> <div class=\"heading\">"+arr[1]+"</div></div><div class=\"parent\"> <div class=\"resultname\">"+arr[2]+"</div> <div class=\"resultname\">"+arr[3]+"</div></div>";
但不想硬编码arr[0]、arr[1]这类索引,之前尝试的for循环实现有问题,求更优的处理方式。原代码如下:
public class StringExtraction { public static void main(String[] args) { String str = "|555|777|AB|CD"; String[] arr = str.substring(1).split("\\|"); String result = ""; //result = "<div class=\"parent\"> <div class=\"heading\">"+arr[0]+"</div> <div class=\"heading\">"+arr[1]+"</div></div><div class=\"parent\"> <div class=\"resultname\">"+arr[2]+"</div> <div class=\"resultname\">"+arr[3]+"</div></div>"; System.out.println("Array length is :-> " + arr.length); for (String s1 : arr) { System.out.println("Value " + s1 + " and its length is " + s1.length()); } for (int i = 0; i < arr.length; i++) { result = "<div class=\"parent\"> <div class=\"heading\">" + arr[i] + "</div> <div class=\"heading\">" + arr[i] + "</div></div><div class=\"parent\"> <div class=\"resultname\">" + arr[i] + "</div> <div class=\"resultname\">" + arr[i] + "</div></div>"; } System.out.println("Print Result below:"); System.out.println(result); } }
原代码问题分析
原循环的核心问题是:每次迭代都会覆盖result变量,最终只保留最后一个元素的重复内容,同时没有区分前两个元素用heading类、后两个用resultname类的逻辑,完全不符合预期需求。
解决方案
方案1:分批次遍历+StringBuilder高效拼接
用StringBuilder替代直接字符串拼接(避免频繁创建字符串对象,提升效率),分两组处理数组元素:前两个生成heading类型的div,后两个生成resultname类型的div,通过循环遍历指定范围的元素,彻底避免硬编码索引。
public class StringExtraction { public static void main(String[] args) { String str = "|555|777|AB|CD"; String[] arr = str.substring(1).split("\\|"); StringBuilder result = new StringBuilder(); // 处理前两个元素,生成第一个parent块 result.append("<div class=\"parent\">"); for (int i = 0; i < 2; i++) { result.append(String.format(" <div class=\"heading\">%s</div>", arr[i])); } result.append("</div>"); // 处理后两个元素,生成第二个parent块 result.append("<div class=\"parent\">"); for (int i = 2; i < arr.length; i++) { result.append(String.format(" <div class=\"resultname\">%s</div>", arr[i])); } result.append("</div>"); System.out.println("Print Result below:"); System.out.println(result.toString()); } }
方案2:封装复用方法,提升扩展性
如果后续可能调整分组数量或class名称,可以把生成parent块的逻辑封装成独立方法,进一步解耦代码,方便后续维护:
public class StringExtraction { public static void main(String[] args) { String str = "|555|777|AB|CD"; String[] arr = str.substring(1).split("\\|"); StringBuilder result = new StringBuilder(); // 生成第一个parent块:取前2个元素,用heading类 result.append(buildParentDiv(arr, 0, 2, "heading")); // 生成第二个parent块:取后2个元素,用resultname类 result.append(buildParentDiv(arr, 2, arr.length, "resultname")); System.out.println("Print Result below:"); System.out.println(result.toString()); } // 封装生成parent div的工具方法 private static String buildParentDiv(String[] arr, int start, int end, String childClass) { StringBuilder parent = new StringBuilder("<div class=\"parent\">"); for (int i = start; i < end; i++) { parent.append(String.format(" <div class=\"%s\">%s</div>", childClass, arr[i])); } parent.append("</div>"); return parent.toString(); } }
方案3:Java Stream简化遍历(Java 8+)
如果偏好函数式编程风格,可以用Stream截取数组片段并拼接结果,代码更简洁:
import java.util.Arrays; import java.util.stream.Collectors; public class StringExtraction { public static void main(String[] args) { String str = "|555|777|AB|CD"; String[] arr = str.substring(1).split("\\|"); // 生成heading组的HTML String headingParent = "<div class=\"parent\"> " + Arrays.stream(arr, 0, 2) .map(item -> String.format("<div class=\"heading\">%s</div>", item)) .collect(Collectors.joining(" ")) + "</div>"; // 生成resultname组的HTML String resultNameParent = "<div class=\"parent\"> " + Arrays.stream(arr, 2, arr.length) .map(item -> String.format("<div class=\"resultname\">%s</div>", item)) .collect(Collectors.joining(" ")) + "</div>"; String result = headingParent + resultNameParent; System.out.println("Print Result below:"); System.out.println(result); } }
内容的提问来源于stack exchange,提问作者Tan
相关产品推荐
相关产品推荐

