Java中ArrayList转HashSet报错求助:文件单词统计代码问题
解答你的Java单词统计代码错误问题
为什么会出现这两个错误?
1. "length无法解析或不是字段" 错误
你代码里的set.length是核心问题:
HashSet属于Java集合框架的类,集合类没有length属性——length是数组特有的字段,用来获取数组长度。- 要获取集合的元素个数,你应该用
set.size()方法。
2. "set[i]必须解析为String" 错误
set[i]这种下标访问方式只适用于数组,而HashSet是无序集合,不支持通过下标访问元素。
- 要遍历Set中的元素,你可以用增强for循环(for-each),或者迭代器来处理。
额外的逻辑问题(影响你的需求实现)
你原本想实现“每行每个单词仅被计数一次”,但当前代码的逻辑有偏差:
sc.next()是按空格分割读取单个单词,会忽略行的边界,没法实现“按行去重”的需求。- 你对
sc.next()得到的单词再做split(" ")是多余的,因为sc.next()已经返回的是单个无空格的单词了。
修正后的代码示例
下面是调整后的代码,实现每行内单词去重,再统计全局单词频率的需求:
import java.io.File; import java.util.*; public class WordCounter { public static void main(String[] args) { try { List<String> list = new ArrayList<>(); File fr = new File("filename.txt"); Scanner sc = new Scanner(fr); // 按行读取,实现每行单词去重 while (sc.hasNextLine()) { String line = sc.nextLine(); // 分割每行的单词(处理可能的多空格、制表符等) String[] wordsInLine = line.trim().split("\\s+"); // 用Set对当前行的单词去重 Set<String> uniqueWordsInLine = new HashSet<>(Arrays.asList(wordsInLine)); // 将去重后的单词加入全局列表 list.addAll(uniqueWordsInLine); } // 统计并输出每个单词的频率 System.out.println("Words with their frequency.."); Set<String> uniqueSet = new HashSet<>(list); for (String word : uniqueSet) { System.out.println(word + ": " + Collections.frequency(list, word)); } sc.close(); } catch (Exception e) { System.out.println("File not found or error occurred: " + e.getMessage()); } } }
代码说明
- 用
sc.hasNextLine()和sc.nextLine()按行读取文本,保证我们能处理每行的单词去重。 - 用
\\s+作为分隔符,能匹配任意空白字符(空格、制表符等),分割每行的单词更准确。 - 对每行的单词用
HashSet去重后,再加入全局列表,这样每行的同一个单词只会被计数一次。 - 最后用
Collections.frequency()统计每个单词在全局列表中的出现次数。
内容的提问来源于stack exchange,提问作者ProgrammingNewb
相关产品推荐
相关产品推荐

