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

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

Jay Walker
Erol Flintstone
C. Erol Madre
Billy Pilgrim
Mickey Angels
José Francisco de San Martín
Squarebob Sponge Pants
Mischa Ternoff
Chester Peak
Al Italia
Ben Dover
Pat Pending

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. Търсех съвет и насоки, откакто моят партньор по програмиране ме остави в безизходица сам. Да, има МНОГО студенти, които публикуват 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