Java实现buildDefinitionList生成HTML定义列表代码错误排查
问题背景
需要实现HtmlBuilder类的静态方法buildDefinitionList(),功能规则如下:
- 接收二维字符串数组格式的定义集合作为入参,每个子数组固定长度为2,依次存储术语名称、术语对应解释
- 方法返回拼接完成的HTML定义列表字符串,使用
<dl>、<dt>、<dd>标签实现 - 如果传入的数组为空(长度为0),直接返回空字符串
入参示例:
String[][] definitions = { {"Bulb", "Bulge, thickening on the surface of something"}, {"Beaver", "An animal from the order of rodents"}, }; HtmlBuilder.buildDefinitionList(definitions);
对应预期返回结果:
<dl><dt>Bulb</dt><dd>Bulge, thickening on the surface of something</dd><dt>Beaver</dt><dd>An animal from the order of rodents</dd></dl>
现有实现问题
当前提交的实现代码如下,运行结果不符合预期:
package com.arrays.problem6; public class HtmlBuilder { public static void main(String[] args) { } public static String buildDefinitionList(String[][] definitions){ var result = new StringBuilder(); result.append("<dl><dt>"); for (var item : definitions) { result.append("<dd>"); result.append(item); result.append("</dl></dd>"); } result.append("</dl></dd>"); return result.toString(); } }
代码存在的具体问题:
- 缺失空入参判断:数组为空时仍然会拼接
<dl>相关标签,不符合空数组返回空字符串的要求 - 标签拼接逻辑混乱:
- 初始化StringBuilder时就拼接了
<dl><dt>,但循环中既没有为每个术语单独生成<dt>标签,也没有对应闭合</dt>的逻辑 - 循环中直接拼接
item对象:item是String[]类型,直接append会输出数组对象的内存地址字符串,无法获取子数组中存储的术语、解释内容 - 闭合标签位置错误:
</dl>是列表的根闭合标签,应该在所有列表项拼接完成后只添加1次,原代码在循环内、循环外多次拼接该标签,还额外多拼了无效的</dd>标签,导致标签嵌套完全错误
- 初始化StringBuilder时就拼接了
修正后代码
按照HTML定义列表的结构规则调整拼接逻辑,修正后代码如下:
package com.arrays.problem6; public class HtmlBuilder { public static void main(String[] args) { } public static String buildDefinitionList(String[][] definitions){ // 空数组场景直接返回空字符串 if (definitions.length == 0) { return ""; } StringBuilder result = new StringBuilder(); result.append("<dl>"); for (String[] item : definitions) { // 拼接术语名称 result.append("<dt>").append(item[0]).append("</dt>"); // 拼接术语解释 result.append("<dd>").append(item[1]).append("</dd>"); } // 所有列表项拼接完成后闭合根标签 result.append("</dl>"); return result.toString(); } }
内容的提问来源于stack exchange,提问作者Pete Alexandrovich
相关产品推荐
相关产品推荐

