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

Java中移除HTML标签并拆分字符串到不同列表的问题排查

问题根源:重复引用同一个列表对象

兄弟,你遇到的重复数据问题其实很典型——你在循环外面只创建了一次List2,每次处理新的交易字符串时,都是往同一个List2里塞数据,然后把这个List2的引用丢进Tuples里。这就意味着Tuples里的所有子列表其实都是指向同一个List2实例,最后所有子列表的内容都会变成最后一次处理完的结果,自然就全是重复数据了。

修复方案:每次循环都创建新的子列表

我给你调整了代码,不仅解决了重复问题,还优化了数据提取的逻辑,让代码更清晰:

import java.util.ArrayList;
import java.util.List;

public class TradeParser {
    public static void main(String[] args) {
        // 模拟你存入的带HTML标签的数据
        List<String> List1 = new ArrayList<>();
        List1.add("<b>SELL 512</b> lots of <b>xyz18@112.00</b>");
        List1.add("<b>BUY 513</b> lots of <b>abc@113.00</b>");
        
        List<List<String>> Tuples = new ArrayList<>();
        List<String> List3 = new ArrayList<>(); // 操作类型(SELL/BUY)
        List<String> List4 = new ArrayList<>(); // 数量
        List<String> List5 = new ArrayList<>(); // 代码前缀
        List<String> List6 = new ArrayList<>(); // 价格整数部分

        for (String tradeItem : List1) {
            // 第一步:先彻底移除所有HTML标签
            String cleanText = tradeItem.replaceAll("<.*?>", "").trim();
            
            // 第二步:拆分出关键数据块
            // 拆分后得到 ["SELL 512", "xyz18@112.00"]
            String[] mainParts = cleanText.split(" lots of ");
            
            // 拆分操作类型和数量
            String[] actionParts = mainParts[0].split(" ");
            String action = actionParts[0];
            String quantity = actionParts[1];
            
            // 拆分代码和价格
            String[] priceParts = mainParts[1].split("@");
            String codeWithSuffix = priceParts[0];
            String priceFull = priceParts[1];
            
            // 提取代码前缀(去掉后面的数字,比如xyz18→xyz)
            String codePrefix = codeWithSuffix.replaceAll("\\d+$", "");
            // 提取价格整数部分
            String priceIntPart = priceFull.split("\\.")[0];
            
            // 创建新的子列表,存入当前交易的所有数据
            List<String> currentTuple = new ArrayList<>();
            currentTuple.add(action);
            currentTuple.add(quantity);
            currentTuple.add(codePrefix);
            currentTuple.add(priceIntPart);
            
            Tuples.add(currentTuple);
        }

        // 把Tuples里的数据分发到各个目标List
        for (List<String> tuple : Tuples) {
            List3.add(tuple.get(0));
            // 如果你需要把SELL/BUY替换成0,改成 tuple.get(0).replaceAll("SELL|BUY", "0")
            List4.add(tuple.get(1));
            List5.add(tuple.get(2));
            List6.add(tuple.get(3));
        }

        // 验证输出
        System.out.println("List3: " + List3);
        System.out.println("List4: " + List4);
        System.out.println("List5: " + List5);
        System.out.println("List6: " + List6);
    }
}
关键修改说明
  • 每次循环新建子列表:在处理每个交易项时,都创建一个新的currentTuple列表,这样Tuples里的每个元素都是独立的,不会互相覆盖。
  • 先清HTML标签再处理:用replaceAll("<.*?>", "")一次性清除所有HTML标签,避免拆分时引入空字符串或无效数据,逻辑更直观。
  • 分步拆分数据:把复杂的拆分拆成多个小步骤,先分交易主体,再分操作/数量、代码/价格,最后提取细分字段,可读性更强,也更容易调试。
  • 代码前缀提取:用replaceAll("\\d+$", "")去掉代码后面的数字(比如xyz18→xyz),如果你的代码前缀规则不同,直接调整这个正则就行。

运行这段代码后,你会得到正确的输出:

List3: [SELL, BUY]
List4: [512, 513]
List5: [xyz, abc]
List6: [112, 113]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:03