我对Java编程很陌生,这实际上是我需要解决的一个家庭作业问题的一部分:我正在将文件的内容作为字符串逐行读取到ArrayList中,以便稍后处理。我需要程序打印出来,以在单独的行上控制台ArrayList的内容,但运行编译后的文件后的输出会打印文件的第一行,然后在下一行一起打印第一行和第二行,然后打印程序的第一行、第二行和第三行。
我对这应该如何工作的理解是,程序将获取我的文件,FileReader和BufferedReader将抓取文件中的文本行作为字符串,然后将其放置在ArrayList中,每个字符串在ArrayList中的不同位置,对吗?有人能告诉我while循环中哪里出错了吗?谢谢
代码:
public class ArrayListDemo
{
public static void main (String[]args)
{
try
{
ArrayList<String> demo= new ArrayList <String>();
FileReader fr= new FileReader("hi.tpl");
BufferedReader reader= new BufferedReader(fr);
String line;
while ((line=reader.readLine()) !=null)
{
//Add to ArrayList
demo.add(line);
System.out.println(demo);
}
reader.close();
}catch (Exception e)
{
System.out.println("Error: "+e.getMessage());
System.exit(0);
}
}
}
获得的输出:
cat
cat, rat
cat, rat, hat
预期输出:
cat
rat
hat
每次看到的输出都是ArrayList.toString()被打印到标准输出的结果。相反,在将文件的内容读取到ArrayList:之后,循环使用ArrayList
while ((line=reader.readLine()) !=null) {
//Add to ArrayList
demo.add(line);
}
reader.close();
//do fun stuff with the demo ArrayList here
for (String s : demo) { System.out.println(s); }
行:
System.out.println(demo);
应为:
System.out.println(line);
然而,这将在一个循环中完成读取和打印。在构建阵列的第一个循环之后,您可能需要执行以下操作:
for (String line : demo) {
System.out.println(line);
}
您必须打印"line"而不是"demo"。实际上,打印演示调用ArrayList的ToString()方法,该方法可能会打印数组元素的序列。
因此:
demo.add(line);
System.out.println(line);
//Add to ArrayList
demo.add(line);
System.out.println(demo);
将行添加到列表中,然后打印整个列表。每次。
您只是打印ArrayList,而不是它的成员。您需要遍历ArrayList,并根据需要打印它们(项目之间使用逗号和空格)。
System.out.println(demo);
应该在循环之外。
演示版将用逗号分隔行。
您必须创建另一个循环来迭代演示。并使用println打印每个元素。
通过语句System.out.println(demo);
显示ArrayList
的对象您确实需要使用这样的语句System.out.println(line);
使用循环逐行显示ArrayList
的内容
最好使用foreach
,如下所示。
for (String line : demo)
{
System.out.println(line);
}
是的,您每次都要打印整个列表,因为您在同一个循环中读取和写入。
如果你在一个循环中完成所有的阅读,然后再进行另一个循环,只为写作,你就会得到预期的输出。
我是这样写的:
public class ArrayListDemo {
public static void main (String [] args) {
try {
List<String> demo= readList(new FileReader("hi.tpl"), "\s+");
writeList(demo, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
private static List<String> readList(Reader reader, String splitRegex) throws IOException {
List<String> values = new ArrayList<String>();
BufferedReader br = null;
try {
br = new BufferedReader(reader);
String line;
while ((line = reader.readLine()) != null) {
String [] tokens = line.split(splitRegex);
for (String token : tokens) {
values.add(token);
}
}
} finally {
try { if (br != null) br.close(); } catch (IOException e) { e.printStackTrace(); }
}
return values;
}
private static void writeList(List<String> list, PrintStream p) throws IOException {
if (list != null && p != null) {
for (String s : list) {
p.println(s);
}
}
}
}
还有一点建议:风格很重要。你对支架的位置和间距太草率了。选择一种风格并保持一致。如果你不这样做,你的代码就更难阅读和理解。
如果您使用的是Java 8:,请尝试此操作
demo.forEach(System.out::println);