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; 会导致它在truefalse 之间来回翻转。 您想要文件中唯一单词的列表吗? 【参考方案1】:

默认情况下,Scanner 使用空格作为分隔符,但您可以显式设置不同的分隔符。例如

scanner.useDelimiter(",");

要选择交替行,最简单的方法是在循环外定义一个boolean 变量,然后每次循环取反(false -&gt; truetrue -&gt; 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 和文件的主要内容,如果未能解决你的问题,请参考以下文章

读取和写入.List文件的ArrayList

Java - 如何将我的 ArrayList 写入文件,并将该文件读取(加载)到原始 ArrayList?

在Java中读取和添加文本文件到Object的ArrayList

数据结构-ArrayList和顺序表

把ArrayList集合的字符串存储到文本文件/把文本文件的数据存储到ArrayList集合中

Java将文件读入ArrayList?