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

Java字符串内容相同但比较返回false,及文本单词去重异常问题

搞定读取文本生成唯一单词数组的两个小问题

我来帮你拆解下这两个问题的根源,再给你落地的解决办法,都是开发中常踩的小坑~

问题1:空字符串偷偷溜进ArrayList

为啥会这样?

你大概率是用了split(" ")来拆分单词,这种方式碰到连续空格、行首/行尾空格时,会生成空字符串。比如一行内容是" hello world ",用split(" ")拆分后会得到["", "", "hello", "world", "", ""],这些空字符串就被误加到列表里了。

怎么解决?

把拆分方式换成split("\\s+")——这个正则能匹配任意空白字符(空格、制表符、换行符等)一次或多次,拆分后不会产生空元素。另外保险起见,拆分后先给每个单词做trim(),再判断是否为空,彻底把空字符串挡在外面。


问题2:相同单词重复添加,字符串比较返回false

核心原因

这种情况是单词「表面相同但实际不同」,常见场景有:

  • 大小写差异:比如"Hello"和"hello",Java字符串比较区分大小写,contains()会认为它们是不同的
  • 前后藏着空白:比如"test "和"test",看起来一样但实际长度不同
  • 带标点符号:比如"test."和"test",标点的存在导致字符串不相等

解决思路

在判断是否加入列表前,先对单词做标准化清洗:

  1. 用trim()去除前后空白
  2. 转成统一大小写(比如全小写toLowerCase()),忽略大小写差异
  3. 去除多余标点(比如用replaceAll("[^a-zA-Z0-9]", "")保留字母数字,可根据需求调整正则)

完整代码示例(Java)

把这些处理逻辑整合起来,代码大概是这样的:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class UniqueWordExtractor {
    public static void main(String[] args) {
        List<String> uniqueWords = new ArrayList<>();
        String filePath = "your_text_file.txt"; // 替换成你的文件路径

        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                // 用\\s+拆分,避免空元素
                String[] rawWords = line.split("\\s+");
                for (String rawWord : rawWords) {
                    // 第一步:清洗空白
                    String cleanedWord = rawWord.trim();
                    // 跳过空字符串
                    if (cleanedWord.isEmpty()) {
                        continue;
                    }
                    // 第二步:统一大小写(不需要可注释)
                    cleanedWord = cleanedWord.toLowerCase();
                    // 第三步:去除标点(按需调整正则,比如保留连字符改成[^a-zA-Z0-9-])
                    cleanedWord = cleanedWord.replaceAll("[^a-zA-Z0-9]", "");
                    // 检查是否已存在,不存在再加入
                    if (!uniqueWords.contains(cleanedWord)) {
                        uniqueWords.add(cleanedWord);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 打印结果
        System.out.println("提取到的唯一单词:");
        for (String word : uniqueWords) {
            System.out.println(word);
        }
    }
}

总结

这两个问题核心都是没对拆分后的单词做足够的清洗和标准化,只要在加入列表前把单词处理成统一格式,就能完美解决啦~

内容的提问来源于stack exchange,提问作者C.Aglar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:38:24