Печать строк в обратном 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();   
}

person Jonathan Cook    schedule 20.06.2015    source источник
comment
Почему бы вам не сохранить его в списке или массиве и не распечатать в обратном порядке?   -  person Madhan    schedule 20.06.2015
comment
Используйте стек. (Рекурсия в одну сторону)   -  person Manikandan    schedule 20.06.2015
comment
Я согласен с @Madhan, см. здесь: stackoverflow .com/questions/10766492/   -  person smoggers    schedule 20.06.2015
comment
@Madhan, я идиот. Я читал это как «не упоминается, не требуется». Даже не рассматривал это.   -  person Jonathan Cook    schedule 20.06.2015
comment
;)l(nltnirp.tuo.metsyS ... о, подождите, вы на самом деле не имели в виду обратную Java.   -  person Jean-François Corbett    schedule 20.06.2015
comment
for (k=20;k<20;k--) должно быть for (k=20-1;k>=0;k--)   -  person Madhan    schedule 20.06.2015
comment
@Madhan Спасибо за это. Это только мой первый курс по Java, и я быстро понимаю, что массивы и вызов методов мне не по плечу. Дерн 5-недельный сжатый курс.   -  person Jonathan Cook    schedule 20.06.2015
comment
Ничто не находится за пределами чьей-либо досягаемости, потратьте на это некоторое время, и вы станете мастером. И вы можете посмотреть ответы других и увидеть, как они это сделали.   -  person Madhan    schedule 20.06.2015
comment
@Madhan Дело не в том, что это выше моего понимания, а в том, что это 5-недельный курс 2 раза в неделю. Я получу это? да. Со сжатым курсом? Возможно нет.   -  person Jonathan Cook    schedule 20.06.2015


Ответы (7)


Самый простой способ — создать список и добавить каждую строку в список при чтении из файла. После этого распечатайте элементы списка в обратном порядке.

Вот моя версия кода для вашей проблемы.

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

}
person Harish Sridharan    schedule 20.06.2015

Используйте стек.

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());
        }
    }
person Raman Shrivastava    schedule 20.06.2015

Если вам разрешено использовать сторонние API, Apache Commons IO содержит класс ReversedLinesFileReader, который читает файлы, аналогичные BufferedReader (за исключением того, что последняя строка идет впереди). Вот документация по API: http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/ReversedLinesFileReader.html

В комментариях намекают на другое (менее эффективное) решение. Вы можете прочитать весь свой файл в ArrayList, перевернуть этот список (например, поместив его содержимое в стек, а затем вытащив его), а затем выполнить итерацию по обратному списку для печати.

EDIT: Вот грубый пример:

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

В вашем примере входные данные 123, abc и т. д. содержат как символы, так и целые числа, поэтому ваши вызовы hasNextInt и nextInt в конечном итоге вызовут исключение. Для чтения строк используйте вместо них hasNextLine и nextLine. Эти методы возвращают 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 );
}
person trooper    schedule 20.06.2015

попробуйте использовать org.apache.commons.io.input.ReversedLinesFileReader, он должен делать то, что вы хотите.

person Tuxxy_Thang    schedule 20.06.2015

Вы можете прочитать строки, как вы уже делаете, но вместо того, чтобы печатать их (потому что это будет печатать их по порядку, а вам нужно наоборот), добавить их в какую-то структуру памяти, такую ​​как список или стек, а затем, во втором цикле повторите эту структуру, чтобы напечатать строки в нужном порядке.

person jotadepicas    schedule 20.06.2015

Используя ваш код и ответы в комментариях, вот пример того, как вы сохраните строки в массиве, а затем распечатаете их в обратном порядке (создав свой собственный код)

{
    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));
    }
}
}
person Mark    schedule 20.06.2015

Использование 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);
}
person Jean Logeart    schedule 20.06.2015