【问题标题】:Printing lines in reverse java在反向java中打印行
【发布时间】:2015-09-06 13:54:23
【问题描述】:

我正试图解决我在编程集中遇到的一个问题。

我们应该编写从文件中读取并打印出来的代码。我明白了,我能做到。

他想让我们做的是把它倒过来打印出来。

文件内容:

abc
123
987

他想要:

987
123
abc

代码如下:

{
    FileReader n=new FileReader("F:\\Java\\Set 8\\output1.txt");
    Scanner in=new Scanner(n);
    int l;
    while (in.hasNext())
    {
        l=in.nextInt();
        System.out.println(l);      
    }
    in.close(); 
}
}

是的,我正在使用 java.io.*;和扫描仪。

最简单的方法是什么?

编辑编辑编辑

这是改进后的代码,我尝试将其放入数组中。

数组中的数据没有打印出来。

public static void main(String[] args) throws IOException
{
    int[]Num=new int[20];
    Scanner in=new Scanner(new FileReader("F:\\Java\\Set 8\\output1.txt"));
    int k;
    for (k=0;k<20;k++)
    {
        Num[k]=in.nextInt();
    }
    //in.close();
    for (k=20;k<20;k--)
    {
        System.out.print(+Num[k]);
    }
    //in.close();   
}

【问题讨论】:

  • 为什么不将其存储在列表或数组中并反向打印
  • 使用堆栈。 (递归一种方式)
  • 我同意@Madhan,请看这里:stackoverflow.com/questions/10766492/…
  • @Madhan 我是个白痴。我一直在阅读它,就像“未提及,不需要”一样。甚至没有考虑到这一点。
  • ;)l(nltnirp.tuo.metsyS ... 哦,等一下,你的意思不是“反向 Java”。

标签: java file reverse println


【解决方案1】:

最简单的方法是构造一个 List 并在读取文件时将每一行添加到列表中。完成后,反向打印列表项。

这是我解决您问题的代码版本。

public static void main(String[] args) throws FileNotFoundException {

    FileReader n = new FileReader("/Users/sharish/Data/abc.xml");
    Scanner in = new Scanner(n);

    ArrayList<String> lines = new ArrayList<String>();

    while (in.hasNext()) {
        lines.add(in.nextLine());
    }

    in.close();
    for (int i = lines.size() - 1; i >= 0; i--) {
        System.out.println(lines.get(i));
    }

}

【讨论】:

    【解决方案2】:

    使用堆栈。

    public static void displayReverse() throws FileNotFoundException {
            FileReader n=new FileReader("C:\\Users\\User\\Documents\\file.txt");
            Scanner in=new Scanner(n);
            Stack<String> st = new Stack<String>();
            while (in.hasNext()) {
                st.push(in.nextLine());      
            }
            in.close(); 
    
            while(!st.isEmpty()) {
                System.out.println(st.pop());
            }
        }
    

    【讨论】:

      【解决方案3】:

      如果您被允许使用第三方 API,Apache Commons IO 包含一个类 ReversedLinesFileReader,它可以读取类似于 BufferedReader 的文件(除了最后一行)。以下是 API 文档:http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/ReversedLinesFileReader.html

      cmets 中暗示了另一种(效率较低的)解决方案。您可以将整个文件读入一个 ArrayList,反转该列表(例如,通过将其内容推入堆栈然后将其弹出),然后遍历您的反转列表以打印。

      编辑: 这是一个粗略的例子:

      ArrayList<String> lines = new ArrayList<String>();
      
      Scanner in = new Scanner(new FileReader("input.txt"));
      while (in.hasNextLine())
      {
          lines.add(in.nextLine());
      }
      

      使用ArrayList 而不是静态数组。我们不一定事先知道文件的长度,所以静态数组在这里没有意义。 http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

      您的示例输入 123abc 等包含字符和整数,因此您对 hasNextIntnextInt 的调用最终会引发异常。要读取行,请改用 hasNextLinenextLine。这些方法返回String,所以我们的ArrayList也需要存储String。 http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine()

      一旦文件在列表中(如果文件很大,这不是一个好的解决方案 - 我们已经将整个文件读入内存),我们可以反转列表(如果保持反转形式有意义),或者只是向后迭代它。

      for (int i=lines.size()-1; i>=0; i--)  // from n-1 downTo 0
      {
          String line = lines.get(i);
          System.out.println( line );
      }
      

      【讨论】:

        【解决方案4】:

        尝试使用 org.apache.commons.io.input.ReversedLinesFileReader,它应该可以满足您的需求。

        【讨论】:

          【解决方案5】:

          你可以像你已经在做的那样阅读这些行,但是不要打印它们(因为这会按顺序打印它们,而你需要它反过来),将它们添加到一些内存结构中,比如 List 或 Stack,然后,在第二个循环中,迭代此结构以按所需顺序打印行。

          【讨论】:

            【解决方案6】:

            使用您的代码和 cmets 中的答案,这是一个示例,说明如何将字符串存储到数组列表中,然后反向打印出来(构建您自己的代码)

            {
                FileReader n=new FileReader("F:\\Java\\Set 8\\output1.txt");
                Scanner in=new Scanner(n);
                int l;
                ArrayList<String> reversed = new ArrayList<String>(); // creating a new String arraylist
                while (in.hasNext())
                {
                    l=in.nextInt();
                    System.out.println(l);      
                    reversed.add(l); // storing the strings into the reversed arraylist
                }
                in.close(); 
                // for loop to print out the arraylist in reversed order
                for (int i = reversed.size() - 1; i >= 0; i--) {
                    System.out.println(reversed.get(i));
                }
            }
            }
            

            【讨论】:

              【解决方案7】:

              使用 Java 8:

              try(PrintWriter out = 
                      new PrintWriter(Files.newBufferedWriter(Paths.get("out.txt")))) {
                  Files.lines(Paths.get("in.txt"))
                       .collect(Collectors.toCollection(LinkedList::new))
                       .descendingIterator()
                       .forEachRemaining(out::println);
              }
              

              【讨论】:

                猜你喜欢
                • 2016-11-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-11-16
                • 1970-01-01
                • 2013-12-07
                相关资源
                最近更新 更多