ArrayList 和文件
Posted
技术标签:
【中文标题】ArrayList 和文件【英文标题】:ArrayList and File 【发布时间】:2016-07-20 19:45:25 【问题描述】:我正在编写一个方法,它接收一个文件并返回一个数组列表以及文件中的所有其他单词。这些文件可以包含多行。例如,如果我扫描文件并读取
"red", "orange", "yellow", "green", "blue", "purple"
该方法应该返回列表
"red","yellow","blue"
我知道这是一个相当简单的问题,如果已经回答,请指出正确的方向。另外,我相信这些是逗号分隔的变量。到目前为止,我有我的标题和扫描仪声明:
public static ArrayList<String>Skip(File file)
ArrayList<String> newList = new ArrayList<String>();
Scanner scanner = new scanner(file);
while(scanner.hasNextLine())
*WHAT DO I DO HERE*
newList.add(____);
scanner.close;
return newList;
【问题讨论】:
您使用扫描仪获取文件名。然后添加它。 完成“其他单词”的一种方法:使用boolean
变量addThisWord
告诉您是否要添加单词。那么当你看到一个单词后,addThisWord = !addThisWord;
会导致它在true
和false
之间来回翻转。
您想要文件中唯一单词的列表吗?
【参考方案1】:
默认情况下,Scanner 使用空格作为分隔符,但您可以显式设置不同的分隔符。例如
scanner.useDelimiter(",");
要选择交替行,最简单的方法是在循环外定义一个boolean
变量,然后每次循环取反(false -> true
和true -> false
)。
boolean includeItem = true;
while (...)
...
includeItem = !includeItem;
剧透警告
这里有一些代码将它们组合在一起,似乎可以满足您的需求:
public static List<String> alternateItemsFrom(File commaSeparatedFile)
throws FileNotFoundException
List<String> results = new ArrayList<String>();
boolean includeItem = true;
try (Scanner scanner = new Scanner(commaSeparatedFile))
scanner.useDelimiter(",");
while (scanner.hasNext())
String item = scanner.next().trim();
if (includeItem)
results.add(item);
includeItem = !includeItem;
return results;
另请注意:
当您为文件创建Scanner
时,可能会抛出FileNotFoundException
。我需要在方法上声明该异常。
虽然您可以在循环后使用 scanner.close()
关闭扫描程序,但在 Java 7+ 中还有一个更好的方法,即所谓的 try-with-resources 块。这保证了即使在您循环时发生异常,扫描器也会关闭。
我已经重命名了方法和一些变量,以便更清楚地表达它们的意图。
【讨论】:
while 循环应该使用 hasNext(),而不是 hasNextLine()。很遗憾你刚刚完成了 OP 的作业,而不是仅仅给出提示让它实现他自己的解决方案。 我认为 OP 是她。她没有提到这是家庭作业。 确实如此。对不起,性别混淆。即使不是家庭作业,做事也比复制粘贴学到的更多。 我同意,但也认为有时看看由更有经验的人编写的惯用解决方案会很有用。显然,只是在不理解的情况下复制和粘贴代码是完全没有意义的。我确实尝试在回复中解释细节。【参考方案2】:扫描器允许读取标记,默认情况下,标记由空格字符分隔。但是,正如the javadoc 所指出的,您可以使用另一个分隔符。
为您的文件选择适当的分隔符,然后逐个令牌(而不是逐行)读取文件令牌,并将每个奇数令牌添加到您的列表中(您可以使用从真到假的布尔值,反之亦然在每次迭代时知道是否必须保留或忽略令牌)。
最后,必须关闭文件上的 Scanner,即使您的代码碰巧抛出了异常。所以你应该使用try-with-resources 来初始化你的扫描仪,以确保它无论如何都关闭了。
javadoc 可以提供帮助。仔细阅读并尝试一下。
【讨论】:
我怀疑你误读了这个问题——它在哪里提到了 unique 词? 也想知道同样的事情。我没有正确关闭扫描仪吗? 不,你没有。如果在您的循环中由于任何原因发生异常,扫描仪将不会关闭。 感谢您的帮助!我将如何搜索数组中的每个其他单词,而不是搜索唯一的单词?我猜它们会位于偶数索引处 我编辑了我的答案来解释这一点。您确实可以使用索引并测试它是否是偶数,或者使用在每次迭代时切换的布尔值以上是关于ArrayList 和文件的主要内容,如果未能解决你的问题,请参考以下文章
Java - 如何将我的 ArrayList 写入文件,并将该文件读取(加载)到原始 ArrayList?
在Java中读取和添加文本文件到Object的ArrayList