如何移除C#中StringBuilder内容里的重复行?
解决StringBuilder中行重复的问题
核心思路
把StringBuilder的内容按行拆分,用有序集合去重,再重新构建回StringBuilder,全程不修改单词本身,也保留StringBuilder类型。
方案一:适合中小型词表
如果词表规模不大,直接拆分后去重:
// 假设你的StringBuilder对象叫sb String content = sb.toString(); // 按所有换行符分割(兼容Windows/Linux/macOS的换行格式) String[] lines = content.split("\\R"); // 用LinkedHashSet去重,同时保留原顺序(只保留第一次出现的行) Set<String> uniqueLines = new LinkedHashSet<>(Arrays.asList(lines)); // 清空原StringBuilder,重新写入去重后的内容 sb.setLength(0); for (String line : uniqueLines) { sb.append(line).append(System.lineSeparator()); } // 移除最后一行多余的换行符(如果不需要可以省略) if (sb.length() > 0) { sb.setLength(sb.length() - System.lineSeparator().length()); }
方案二:适合大型词表(低内存占用)
如果词表非常大,一次性拆分数组会占用过多内存,用逐行读取的方式处理:
// 假设你的StringBuilder对象叫sb String content = sb.toString(); sb.setLength(0); // 先清空原内容 try (BufferedReader reader = new BufferedReader(new StringReader(content))) { String line; Set<String> seenLines = new LinkedHashSet<>(); while ((line = reader.readLine()) != null) { // add方法返回true表示该行之前未出现过,才写入 if (seenLines.add(line)) { sb.append(line).append(System.lineSeparator()); } } } catch (IOException e) { // 读取字符串不会抛出IO异常,这里仅做兜底 e.printStackTrace(); } // 移除最后多余的换行符(可选) if (sb.length() > 0) { sb.setLength(sb.length() - System.lineSeparator().length()); }
关键说明
- 用
LinkedHashSet而不是普通HashSet:前者会保留行的原始顺序,只移除后续重复的行;后者会打乱顺序。 - 不修改单词本身:整个过程只是判断行的重复,不会修改任何单词的内容。
- 保留StringBuilder类型:最终操作的还是原StringBuilder对象(清空后重新写入),符合你的要求。
内容的提问来源于stack exchange,提问作者user1806967
相关产品推荐
相关产品推荐

