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

时间:2012-01-07 16:47:18

标签: java arraylist

我是Java编程的新手,这实际上是我需要解决的一个问题的一部分:我正在逐行读取一个文件的内容作为一个String到一个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

9 个答案:

答案 0 :(得分:5)

该行:

System.out.println(demo);

应该是:

System.out.println(line);

然而,这将在一个循环中进行读取和打印。在构建数组的第一个循环之后,可能需要执行以下操作:

for (String line : demo) {
  System.out.println(line);
}

答案 1 :(得分:5)

每次看到的输出是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); }

答案 2 :(得分:4)

你必须打印“line”而不是“demo”。事实上,打印演示调用ArrayList的ToString()方法,该方法可能会打印数组元素的序列。

所以:

demo.add(line);
System.out.println(line);

答案 3 :(得分:3)

//Add to ArrayList
demo.add(line);
System.out.println(demo);

您将该行添加到列表中,然后打印整个列表。每一次。

答案 4 :(得分:2)

您只是打印ArrayList,而不是其成员。您需要iterate through the ArrayList,并根据需要打印它们(使用项目之间的逗号和空格)。

答案 5 :(得分:1)

System.out.println(demo);应该在循环之外。

将使用逗号分隔线条打印演示。

您必须创建另一个循环来迭代演示。并使用println打印每个元素。

答案 6 :(得分:1)

是的,你每次都打印整个列表,因为你在同一个循环中阅读和写作。

如果您在一个循环中执行所有读操作,然后执行另一个循环操作,那么您将获得预期的输出。

以下是我写的方式:

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);
            }
        }
    }      
}

还有一点建议:风格很重要。你的支撑位置和间距很邋。选择一种风格并保持一致。如果不这样做,您的代码将难以阅读和理解。

答案 7 :(得分:1)

您正在显示ArrayList语句System.out.println(demo);的对象 您确实需要使用这样的语句ArrayList

使用循环逐行显示System.out.println(line);的内容

最好使用foreach,如下所示。

for (String line : demo) 
{
    System.out.println(line);
}

答案 8 :(得分:0)

如果您使用Java 8

,请尝试此操作
demo.forEach(System.out::println);