【问题标题】:Printing Java ArrayList contents line by line to console将 Java ArrayList 内容逐行打印到控制台
【发布时间】:2012-02-04 23:27:48
【问题描述】:

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

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

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

    demo 会打印出来,用逗号隔开。

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

    【讨论】:

    • 这会导致 cat, rat, hat,而不是单独的行上的期望输出。
    【解决方案2】:

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

    如果您在一个循环中完成所有读取操作,然后再进行一个循环写入,您将获得预期的输出。

    我是这样写的:

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

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

    【讨论】:

    • 这为正在做作业的人显示了很多代码。
    • 别人应该怎么学习?为什么允许作业乱七八糟?
    • 嗯,它不一定是一团糟,但我怀疑如果所有代码都放在银盘上交给他们,他们会知道。
    • 首先,让我们记住,OP 发布了他们的整个班级。没有为他们做任何事。其次,如果您查看我发布的内容,您会发现我所做的只是将原始代码重构为两种方法。这是“不要将所有内容都放在主要方法中”的一课。没有错。你什么都没发。您是否在此处浪费大量时间发布 cmets 以了解其他人的努力?
    • @duffymo 我需要能够标记字符串以及搜索 ArrayList:使用 List 实现会比直接创建 ArrayList 更好吗?
    【解决方案3】:

    行:

    System.out.println(demo);
    

    应该是:

    System.out.println(line);
    

    但是,这将在一个循环中完成读取和打印。在第一次循环构建数组后,您可能需要执行以下操作:

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

    【讨论】:

    • 感谢聪明人!我可能需要第二个循环,还不太确定。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:
      //Add to ArrayList
      demo.add(line);
      System.out.println(demo);
      

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          您必须打印“line”而不是“demo”。实际上打印demo调用了ArrayList的ToString()方法,很可能会打印出数组元素的顺序。

          所以:

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

          【讨论】:

            【解决方案8】:

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

            最好使用foreach,如下所示。

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

            【讨论】:

              【解决方案9】:

              如果你使用Java 8,试试这个:

              demo.forEach(System.out::println);
              

              【讨论】:

                猜你喜欢
                • 2011-08-06
                • 2015-03-16
                • 1970-01-01
                • 2015-04-12
                • 2014-04-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-03-29
                相关资源
                最近更新 更多