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
相关产品推荐
相关产品推荐

