从文本文件生成随机单词时每次返回组合固定不变的问题求助
问题根因&修复方案
1. 随机数取值范围错误
你当前使用的ThreadLocalRandom.current().nextInt(0, size - 1)存在参数错误:
ThreadLocalRandom的nextInt(origin, bound)方法是左闭右开规则,即生成的随机数包含origin、不包含bound。你传入size - 1作为bound,会永远取不到数组最后一个元素,正确写法应该是nextInt(0, size)。
2. 文件读取逻辑不严谨
InputStream.available()返回的是当前可无阻塞读取的字节数预估,不是文件的总大小,直接用这个值作为缓冲区大小很容易出现读取不完整的问题,导致拆分出来的单词数组始终是截断后的固定内容。同时如果你的words.txt是在Windows系统下编写的,换行符是\r\n,用split("\n")拆分后每个单词末尾会残留\r字符,容易出现不同下标对应字符串内容相同的问题。
修正后的完整代码如下:
public void correct_button(View view) { StringBuilder textBuilder = new StringBuilder(); try (InputStream is = getAssets().open("words.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { String line; // 逐行读取直接规避换行符兼容问题 while ((line = reader.readLine()) != null) { textBuilder.append(line).append("\n"); } } catch (IOException ex) { ex.printStackTrace(); } String[] separated = textBuilder.toString().split("\n"); int size = separated.length; // 修正随机数范围 int randomNum = ThreadLocalRandom.current().nextInt(0, size); String randomWord = separated[randomNum]; // 注意:此处需要把randomWord赋值给全局变量/更新到UI控件,否则局部变量不会生效 }
3. 局部变量未生效问题
你当前代码里的randomWord是方法内部的局部变量,方法执行结束后就会被回收,如果你没有把这个值赋值给全局变量、或者更新到界面显示的控件上,会出现界面上的单词始终不变的错觉。
优化建议
可以把单词数组缓存为全局变量,避免每次点击按钮都重复读取assets文件,提升性能:
// 全局变量缓存单词数组 private String[] wordArray; // 在onCreate等初始化方法里提前读取一次即可 private void initWordArray() { List<String> wordList = new ArrayList<>(); try (InputStream is = getAssets().open("words.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { String line; while ((line = reader.readLine()) != null) { // 过滤空行 if (!line.trim().isEmpty()) { wordList.add(line.trim()); } } } catch (IOException ex) { ex.printStackTrace(); } wordArray = wordList.toArray(new String[0]); } public void correct_button(View view) { if (wordArray == null || wordArray.length == 0) { return; } int randomNum = ThreadLocalRandom.current().nextInt(0, wordArray.length); String randomWord = wordArray[randomNum]; // 后续更新UI逻辑 }
内容的提问来源于stack exchange,提问作者user16240688
相关产品推荐
相关产品推荐

