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