You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java作业求助:交替替换指定字符功能异常,始终返回原字符串

解决字符串下划线替换为交替
return (<I>和</I>)
的问题

首先,你的代码始终返回原字符串,核心问题出在下划线数量的判断逻辑上,还有代码片段看起来没写完(while(temp.contains("..."))这部分明显不对)。我来一步步帮你修正:

问题1:运算符优先级导致判断错误

你现在的判断条件:

if(temp.length() - temp.replace("_", "").length() % 2 == 0)

这里%的优先级比-高,所以实际执行顺序是先计算temp.replace("_", "").length() % 2,再用原长度减去这个结果,这完全不是在判断下划线数量是否为偶数。正确的做法是把计算下划线总数的部分用括号括起来:

int underlineCount = temp.length() - temp.replace("_", "").length();
if(underlineCount % 2 == 0)

这样才能准确判断下划线数量是不是偶数。

问题2:替换逻辑的缺失

你的代码里while(temp.contains("..."))明显是写错了,应该是循环替换下划线为交替的<I>和</I>。这里可以用一个标记变量来控制当前应该替换成开标签还是闭标签,比如用一个布尔值isOpenTag,初始为true,每替换一次就反转标记。

完整修正后的代码

public String convertItalics() {
    String temp = line;
    // 计算下划线的总数
    int underlineCount = temp.length() - temp.replace("_", "").length();
    // 如果数量为奇数,直接返回原字符串
    if (underlineCount % 2 != 0) {
        return line;
    }
    // 偶数的话开始交替替换
    boolean isOpenTag = true;
    // 循环替换每一个下划线
    while (temp.contains("_")) {
        if (isOpenTag) {
            temp = temp.replaceFirst("_", "<I>");
        } else {
            temp = temp.replaceFirst("_", "</I>");
        }
        // 切换标签类型
        isOpenTag = !isOpenTag;
    }
    return temp;
}

测试示例

  • 输入字符串:Hello_World_Java_(4个下划线,偶数),会被替换成Hello<I>World</I><I>Java</I>
  • 输入字符串:Hello_World_Java(3个下划线,奇数),会直接返回原字符串

额外说明

  • 用replaceFirst是因为每次只替换第一个出现的下划线,这样才能交替切换标签;如果用replace会一次性把所有下划线换成同一个标签,不符合要求。
  • 先判断下划线数量奇偶性,避免做无用的替换操作,提升效率。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:02:53