Java字符串内容相同但比较返回false,及文本单词去重异常问题
搞定读取文本生成唯一单词数组的两个小问题
我来帮你拆解下这两个问题的根源,再给你落地的解决办法,都是开发中常踩的小坑~
问题1:空字符串偷偷溜进ArrayList
为啥会这样?
你大概率是用了split(" ")来拆分单词,这种方式碰到连续空格、行首/行尾空格时,会生成空字符串。比如一行内容是" hello world ",用split(" ")拆分后会得到["", "", "hello", "world", "", ""],这些空字符串就被误加到列表里了。
怎么解决?
把拆分方式换成split("\\s+")——这个正则能匹配任意空白字符(空格、制表符、换行符等)一次或多次,拆分后不会产生空元素。另外保险起见,拆分后先给每个单词做trim(),再判断是否为空,彻底把空字符串挡在外面。
问题2:相同单词重复添加,字符串比较返回false
核心原因
这种情况是单词「表面相同但实际不同」,常见场景有:
- 大小写差异:比如
"Hello"和"hello",Java字符串比较区分大小写,contains()会认为它们是不同的 - 前后藏着空白:比如
"test "和"test",看起来一样但实际长度不同 - 带标点符号:比如
"test."和"test",标点的存在导致字符串不相等
解决思路
在判断是否加入列表前,先对单词做标准化清洗:
- 用
trim()去除前后空白 - 转成统一大小写(比如全小写
toLowerCase()),忽略大小写差异 - 去除多余标点(比如用
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
相关产品推荐
相关产品推荐

