将Java ArrayList内容逐行打印到控制台



我对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);

最新更新