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

将Java ArrayList内容逐行打印到控制台,java,arraylist,Java,Arraylist,我对Java编程非常陌生,这实际上是我家庭作业需要解决的一个问题的一部分:我正在将文件的内容作为字符串逐行读取到ArrayList中,以供以后处理。我需要将程序打印出来,以便在单独的行上控制台ArrayList的内容,但运行编译文件后的输出会打印文件的第一行,然后在下一行上一起打印第一行和第二行,然后打印程序的第一行、第二行和第三行 我对这应该如何工作的理解是,程序将获取我的文件,FileReader和BufferedReader将获取文件中的文本行作为字符串,然后将它们放置在ArrayList

我对Java编程非常陌生,这实际上是我家庭作业需要解决的一个问题的一部分:我正在将文件的内容作为字符串逐行读取到ArrayList中,以供以后处理。我需要将程序打印出来,以便在单独的行上控制台ArrayList的内容,但运行编译文件后的输出会打印文件的第一行,然后在下一行上一起打印第一行和第二行,然后打印程序的第一行、第二行和第三行

我对这应该如何工作的理解是,程序将获取我的文件,FileReader和BufferedReader将获取文件中的文本行作为字符串,然后将它们放置在ArrayList中,每个字符串位于ArrayList右侧的不同位置?有人能告诉我在while循环中哪里出错了吗?谢谢

代码:

预期产出:

cat
cat, rat
cat, rat, hat
cat
rat
hat
System.out.println(演示)应该在循环之外

演示将以逗号分隔行打印


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

是的,每次都打印整个列表,因为您在同一个循环中读写

如果您在一个循环中读取所有内容,然后在另一个循环中进行写入操作,那么您将获得预期的输出

我是这样写的:

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);
            }
        }
    }      
}
公共类ArrayListDemo{
公共静态void main(字符串[]args){
试一试{
List demo=readList(新文件阅读器(“hi.tpl”),“\\s+”;
编写列表(演示、系统输出);
}捕获(例外e){
e、 printStackTrace();
}
}
私有静态列表readList(Reader Reader,String splitRegex)引发IOException{
列表值=新的ArrayList();
BufferedReader br=null;
试一试{
br=新的BufferedReader(读卡器);
弦线;
而((line=reader.readLine())!=null){
String[]tokens=line.split(splitRegex);
for(字符串标记:标记){
添加(令牌);
}
}
}最后{
尝试{if(br!=null)br.close();}catch(IOException e){e.printStackTrace();}
}
返回值;
}
私有静态void writeList(列表列表,PrintStream p)引发IOException{
如果(列表!=null&&p!=null){
用于(字符串s:列表){
p、 println(s);
}
}
}      
}
还有一点建议:风格很重要。你在支架的位置和间距上太马虎了。选择一种风格并保持一致。如果不这样做,代码将更难阅读和理解。

行:

System.out.println(demo);
应该是:

System.out.println(line);
然而,这将在一个循环中完成读取和打印。在构建阵列的第一个循环之后,可能需要执行以下操作:

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

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

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

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

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

因此:


您正在通过语句
System.out.println(演示)显示
ArrayList
的对象 您确实需要使用这样的语句
System.out.println(line),使用循环逐行显示
ArrayList
的内容

最好使用
foreach
,如下所示

for (String line : demo) 
{
    System.out.println(line);
}
如果您正在使用:


这将导致cat、rat、hat不是单独在线的期望输出。这为正在做作业的人显示了大量代码。其他人应该如何学习?为什么家庭作业被允许乱七八糟?当然,这不一定是乱七八糟的,但我怀疑如果把所有的代码都放在一个银盘上交给他们,他们是否会学习。首先,让我们记住,OP发布了他们的整个课程。没有为他们做任何事。第二,如果你看一下我发布的内容,你会发现我所做的只是将原始代码重构成两个方法。这是一堂“不要把所有的东西都放在一个主方法中”的课,这没什么错。你什么也没发。你在这里浪费了很多时间来评论别人的努力吗?@duffymo我需要能够标记字符串并搜索ArrayList:使用列表实现会比直接创建ArrayList更好吗?谢谢brainzzy!我可能需要第二个循环,还不太确定。
//Add to ArrayList
demo.add(line);
System.out.println(demo);
demo.add(line);
System.out.println(line);
for (String line : demo) 
{
    System.out.println(line);
}
demo.forEach(System.out::println);