反向 java 中的打印行



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

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

他要我们做的是把它反过来打印出来。

该文件显示:

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

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

这是我针对您的问题的代码版本。

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

使用 Stack。

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

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

评论中暗示了另一个(效率较低)的解决方案。您可以将整个文件读入 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 也需要存储字符串。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 );
}
public static void main(String[] args) throws Exception{
    String fileName = "F:\Java\Set 8\output1.txt";
    RandomAccessFile raf = new RandomAccessFile(fileName,"r");
    int len = (int) raf.length();
    raf.seek(len);
    while(len >= 0){
        if(len == 0){
            raf.seek(0);
            System.out.println(raf.readLine());
            break;
        }
        raf.seek(len--);
        char ch = (char)raf.read();
        if(ch == 'n'){
            String str = raf.readLine();
            System.out.println(str);
        }
    }
    
}

尝试使用org.apache.commons.io.input.ReversedLinesFileReader,它应该可以做你想要的。

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

使用您的代码和注释中的答案,下面是如何将字符串存储到 arraylist 中,然后反向打印它们的示例(基于您自己的代码构建)

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

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

相关内容

  • 没有找到相关文章

最新更新