Java文件逐词解析:如何生成指定格式的ArrayList?
解决方案:将文件文本拆分为包含单词和独立标点的ArrayList
没问题,我来帮你实现这个需求!要把Sample.txt里的内容转换成你想要的ArrayList<String>,核心是先读取整个文件内容为单个字符串,再用合适的正则表达式分割,把单词和标点符号单独拆分出来,具体步骤如下:
1. 读取文件内容
首先需要把文件里的所有内容读取成一个完整的字符串(而不是按行分割的数组)。如果你的Java版本是11及以上,用Files.readString()会非常简洁;如果是更低版本,可以用BufferedReader拼接每行内容。
2. 正则分割字符串
关键是用正则表达式把单词、标点符号、空格区分开:我们需要把engineer.拆成engineer和.,同时把空格作为分隔符。这里推荐的正则是:"(?<=\\p{Punct})|(?=\\p{Punct})|\\s+"
正则解释:
(?<=\\p{Punct}):正向肯定后发断言,匹配标点符号后面的位置(比如engineer.里.的后面)(?=\\p{Punct}):正向肯定前瞻断言,匹配标点符号前面的位置(比如engineer.里.的前面)\\s+:匹配一个或多个空白字符(空格、换行等)
这三个规则用|连接,就能实现把标点单独拆出来,同时按空格分割单词。
3. 转换为ArrayList并过滤空元素
分割后可能会出现空字符串(比如连续空格的情况),需要过滤掉这些无效元素,再把数组转换成ArrayList。
完整代码示例(Java 11+)
import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class FileTextSplitter { public static void main(String[] args) { try { // 读取文件全部内容为单个字符串 String fileContent = Files.readString(Paths.get("Sample.txt")); // 用正则分割字符串,拆分单词和标点 String[] splitElements = fileContent.split("(?<=\\p{Punct})|(?=\\p{Punct})|\\s+"); // 转换为ArrayList并过滤空元素 List<String> resultList = new ArrayList<>(); for (String element : splitElements) { if (!element.trim().isEmpty()) { resultList.add(element); } } // 输出你想要的格式 System.out.println(resultList); } catch (Exception e) { e.printStackTrace(); } } }
Java 8及以下版本兼容代码
如果你的Java版本低于11,替换文件读取部分为BufferedReader实现:
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List; public class FileTextSplitter { public static void main(String[] args) { try { // 读取文件内容并拼接成单个字符串 StringBuilder contentBuilder = new StringBuilder(); try (BufferedReader reader = new BufferedReader(new FileReader("Sample.txt"))) { String line; while ((line = reader.readLine()) != null) { contentBuilder.append(line).append(" "); // 行之间加空格避免连字 } } String fileContent = contentBuilder.toString().trim(); // 后续分割和转换步骤和上面一致 String[] splitElements = fileContent.split("(?<=\\p{Punct})|(?=\\p{Punct})|\\s+"); List<String> resultList = new ArrayList<>(); for (String element : splitElements) { if (!element.trim().isEmpty()) { resultList.add(element); } } System.out.println(resultList); } catch (Exception e) { e.printStackTrace(); } } }
运行这段代码后,你会得到预期的输出:
[Hi, my, name, is, john, and, I, am, an, engineer, ., How, are, you]
注意:ArrayList的默认toString()输出会在元素间加空格,但每个元素本身是你需要的独立内容(比如"engineer"和"."都是单独的元素),完全符合你的需求。
内容的提问来源于stack exchange,提问作者param trivedi
相关产品推荐
相关产品推荐

