Java ArrayList和文件

Java ArrayList和文件,java,file,arraylist,while-loop,java.util.scanner,Java,File,Arraylist,While Loop,Java.util.scanner,我正在编写一个方法,该方法接收一个文件并返回一个数组列表,其中包含文件中的每一个字。文件可以包含多行。例如,如果我扫描文件,它会读取 {"red", "orange", "yellow", "green", "blue", "purple"} 该方法应返回列表 {"red","yellow","blue"} 我知道这是一个相当简单的问题,如果已经回答了,请给我指出正确的方向。另外,我相信这些是逗号分隔的变量。到目前为止,我有我的标题和扫描仪声明: public static ArrayLis

我正在编写一个方法,该方法接收一个文件并返回一个数组列表,其中包含文件中的每一个字。文件可以包含多行。
例如,如果我扫描文件,它会读取

{"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;
publicstaticarraylistskip(文件)
ArrayList newList=新的ArrayList();
扫描仪=新扫描仪(文件);
while(scanner.hasNextLine()){
*我在这里干什么*
newList.add(__;);
}
scanner.close;
}
返回newList;

扫描仪允许读取令牌,默认情况下,令牌由空格字符分隔。但是,如图所示,您可以使用另一个分隔符

为文件选择适当的分隔符,然后逐个标记(而不是逐行)读取文件标记,并将每个奇数标记添加到列表中(您可以在每次迭代中使用从true到false的布尔值,反之亦然,以了解是否必须保留或忽略标记)

最后,必须关闭文件上的扫描程序,即使您的代码碰巧抛出异常。因此,您应该使用初始化扫描仪,以确保无论发生什么情况,它都处于关闭状态


javadoc就是来帮忙的。仔细阅读并尝试一些方法。

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

scanner.useDelimiter(",");
要选择备用行,最简单的方法是在循环外部定义一个
布尔
变量,然后每次循环时对其求反(
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;
}
public static List alternativeItemsFrom(文件commaSeparatedFile)
抛出FileNotFoundException{
列表结果=新建ArrayList();
布尔includeItem=true;
尝试(扫描仪=新扫描仪(commaSeparatedFile)){
scanner.useDelimiter(“,”);
while(scanner.hasNext()){
字符串项=scanner.next().trim();
如果(包括他们){
结果:增加(项目);
}
includeItem=!includeItem;
}
}
返回结果;
}
另请注意:

  • 为文件创建
    扫描仪时,可能会引发
    FileNotFoundException
    。我需要在方法上声明该异常

  • 尽管可以在循环后使用
    scanner.close()
    关闭扫描仪,但在Java 7+中有一种更好的方法,即所谓的try with resources块。这保证了即使在循环时发生异常,扫描仪也会关闭

  • 我重新命名了方法和一些变量,试图更清楚地表达它们的意图


您可以使用scanner获取文件名。然后添加它。完成“每隔一个单词”的一种方法是:使用一个
boolean
变量
addThisWord
,它告诉您是否要添加这个单词。然后在你看到一个单词后,
addThisWord=!加上这个词
将导致它在
true
false
之间来回翻转。是否要从文件中列出唯一的单词?我怀疑您误读了这个问题——它在哪里说明了唯一的单词?也在想同样的事情。我没有正确地关闭扫描仪吗?不,你没有。如果由于任何原因在循环中发生异常,扫描仪将不会关闭。不过,感谢您的帮助!我如何搜索数组中的每个其他单词,而不是搜索唯一的单词?我猜他们甚至会在Indexe找到我编辑了我的答案来解释这一点。您确实可以使用索引并测试它是否为偶数,或者使用在每次迭代时切换的布尔值。while循环应该使用hasNext(),而不是hasNextLine()。很遗憾,你只是做了OP的家庭作业,而不是仅仅给出提示让它实现他自己的解决方案。我认为OP是一个she。她没有提到那是家庭作业,真的。很抱歉性别混淆。即使不是家庭作业,你也可以通过做事情而不是通过复制和粘贴东西来学到更多。我同意,但我也认为,有时看到一个由更有经验的人编写的惯用解决方案会很有用。显然,只是在不理解的情况下复制和粘贴代码是完全没有意义的。我确实在回答中解释了细节。