Чтение текстового файла на Java и печать назад с рекурсией

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

Джей Уокер
Эрол Флинтстоун
К. Эрол Мадре
Билли Пилигрим
Микки Энджелс
Хосе Франсиско де Сан-Мартин
Губчатые штаны Squarebob
Миша Тернофф
Пик Честера
Аль-Италия
Бен Довер
Ожидается получение патента

Я 100% потерян. Хотелось бы совета, с чего начать в первую очередь. Думая о программе, я хотел создать main, которая вызывала бы сканер, который сначала считывал бы файл. При чтении файла он будет считать символы в тексте (быстрый вопрос, будет ли сканер считать пробелы между символами?).

Затем я подумал о простой функции print, которая бы отображала весь файл names.txt.

Наконец, часть, в которой я на 110% запуталась... как, черт возьми, я могу перечислить имена в обратном порядке? Что бы я использовал? Как рекурсия вписывается во все это?


person Vivin Viswanathan    schedule 23.10.2012    source источник
comment
Если это домашнее задание, вам нужно отметить его homework.   -  person Sean Owen    schedule 23.10.2012
comment
@Sean, нет; это в процессе удаления.   -  person Ben    schedule 23.10.2012
comment
Я исправляюсь, упс. Больше никаких тегов домашних заданий. (Я все еще думаю, что было бы неплохо заявить об этом заранее, и это почти наверняка домашнее задание.)   -  person Sean Owen    schedule 23.10.2012
comment
Очень поздний ответ, я знаю. Я ценю мораль, стоящую за тем, чтобы не делать за людей домашнюю работу, но я задавал прямые вопросы, на которые можно было бы ответить, вместо того, чтобы говорить, что они находятся в процессе удаления. Да, это был хвк. Я искал совета и руководства, так как мой партнер по программированию оставил меня в одиночестве. Да, есть МНОГО студентов, которые публикуют вопросы hwk для простых ответов в стеке, но я не был одним из них, и то, что я не дал моему сообщению шанса и немедленно отправил его на удаление, делает этот сайт неприветливым и не соответствует его миссии (stackoverflow.com/tour)   -  person Vivin Viswanathan    schedule 22.05.2015


Ответы (6)


Что-то вроде этого:

Reader(Stream strm)
{
    string line;

    if(!strm.eof())
    {
        line = strm.ReadLine();
        Reader(strm);
    }

    // Info - char counte etc
    string parseResult = Parse(line);
    Print(parseResult);
}

Рекурсия остановится в конце файла и начнет разворачиваться. Последнее сообщение будет напечатано первым.

person kuperspb    schedule 23.10.2012

Псевдокод для рекурсивной части:

function printLines(lines):
    if lines not empty:
        print first line from lines // this prints lines in order
        call printLines(remaining lines)
        print first line again      // this prints lines in reverse order

Пример вывода для строк ["line1", "line2", "line3"]

line1   // 1st output for printLines(["line1", "line2", "line3"])
line2   // 1st output for printLines(["line2", "line3"])
line3   // 1st output for printLines(["line3"])
        //  no output for printLines([])
line3   // 2nd output for printLines(["line3"])
line2   // 2nd output for printLines(["line2", "line3"])
line1   // 2nd output for printines(["line1", "line2", "line3"])
person tobias_k    schedule 23.10.2012

Вы можете прочитать файл с scanner.nextLine(). Он будет читать всю строку, включая пробелы.

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

function print( i )
     if i == wayEnd
        return
     print(i + 1) // go ahead
     // after you return, print:
     output house at i

ДОБАВИТЬ

Тогда код метода должен быть:

private static Scanner scanner;
private static void readFile() {
      if (!scanner.hasNext()) return;
      String line = scanner.nextLine();
      readFile();
      System.out.println(line);
}

Просто вам нужно вызвать readFile() из основного:

public static void main(String[] args) {
     scanner = new Scanner(new File("myText.txt"));
     readFile();
}
person Community    schedule 23.10.2012

Я не силен в сканировании, но с помощью сканера Desolator вы можете сделать остальную часть следующим образом:

private Scanner scanner;
static Map<String, Integer> counts = new HashMap<String, Integer>(); 
public static void main(String[] args) {
 scanner = new Scanner(new File("myText.txt"));
 readFile();
 System.out.println(counts);
}
 private void readFile() {
          if (!scanner.hasNext()) return;
          String line = scanner.nextLine();
          String[] names = line.split("([\\W\\s]+)");
          for(int i=0;i<names.length;i++) {
              populateMap(names[i]);
          }
          readFile();
    }
static void populateMap(String str) {
    counts.put(reverse(str), str.length());     

}
static String reverse(String s) {
    if(s.length() == 0)
        return "";
    return s.charAt(s.length() - 1) + reverse(s.substring(0,s.length()-1));
}
person Arham    schedule 23.10.2012

Чтобы тренировать свои навыки Java, я написал вам следующий код:

import java.util.*;
import java.io.*;

public class RecursiveReadNames{
    public static final int MAXLINES = 10;

    public static void main(String[] args) throws FileNotFoundException {
        Scanner scan = new Scanner(new File("listOfNames.txt"));
        String[] names = new String[MAXLINES];

        readNames(names, scan, 0);
        printNames(names,0);
        System.out.println();
        printNamesReverse(names,0);
        System.out.println(totalNumberOfCharsInNames(names, 0,0));
    }

    static String[] readNames(String[] names, Scanner scan, int curLine) {
        if(curLine >= MAXLINES)
            return names;
        names[curLine] = scan.nextLine();
        return readNames(names, scan, curLine+1);
    }

    static void printNames(String[] names, int cur) {
        if(cur >= names.length)
            return;
        System.out.println(names[cur]);
        printNames(names, cur+1);
    }

    static void printNamesReverse(String[] names, int cur) {
        if(cur >= names.length)
            return;
        printNamesReverse(names, cur+1);
        System.out.println(names[cur]);     
    }

    static int totalNumberOfCharsInNames(String[] names, int cur, int sum) {
        if(cur >= names.length)
            return sum;
        return totalNumberOfCharsInNames(names, cur+1, sum+names[cur].length());
    }
}
person halex    schedule 23.10.2012

сделать что-то вроде этого

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;


public class Test {
    public static void printname(String name,BufferedReader br)
    {

        if(name!=null && br!=null)
        {
            try {
                Test.printname(br.readLine(), br);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(name);
        }
    }
    static Scanner scanner1 = new Scanner(System.in);

    public static void main(String[] args)
    {
        //print the names and total character in each name
        try {
            FileInputStream fin=new FileInputStream("d:\\file.txt");
            BufferedReader br=new BufferedReader(new InputStreamReader(fin));
            String n;
            while((n=br.readLine())!=null)
            {
                System.out.println(n+" length:"+n.length());
            }
            fin.close();
            br.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //print names in reverse order
        try {
            FileInputStream f=new FileInputStream("d:\\file.txt");
            BufferedReader br=new BufferedReader(new InputStreamReader(f));
            try {
                Test.printname(br.readLine(),br);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            f.close();
            br.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

}

обратите внимание, что я передаю объект br

person Bhavik Shah    schedule 23.10.2012