在Java中读取文本文件并使用递归向后打印

在Java中读取文本文件并使用递归向后打印,java,list,loops,recursion,text-files,Java,List,Loops,Recursion,Text Files,编写一个Java程序,递归地从一个文件中读取十个名称,然后按相反顺序输出名称、名称列表和名称列表中的字符总数。所有循环都必须递归执行 杰伊·沃克 埃罗尔燧石 C.埃罗马德雷 比利朝圣者 米奇天使 何塞·弗朗西斯科·德·圣马丁 方形海绵长裤 米沙·特诺夫 切斯特峰 意大利铝业 本多佛 Pat待定 我完全迷路了。我想知道第一个出发点在哪里。考虑到这个程序,我想构建一个main,它将调用一个扫描仪,首先读取文件。读取文件时,它会计算文本中的字符数(快速提问,扫描仪会计算字符之间的空格吗?) 接下来,我

编写一个Java程序,递归地从一个文件中读取十个名称,然后按相反顺序输出名称、名称列表和名称列表中的字符总数。所有循环都必须递归执行

杰伊·沃克
埃罗尔燧石
C.埃罗马德雷
比利朝圣者
米奇天使
何塞·弗朗西斯科·德·圣马丁
方形海绵长裤
米沙·特诺夫
切斯特峰
意大利铝业
本多佛
Pat待定

我完全迷路了。我想知道第一个出发点在哪里。考虑到这个程序,我想构建一个main,它将调用一个扫描仪,首先读取文件。读取文件时,它会计算文本中的字符数(快速提问,扫描仪会计算字符之间的空格吗?)

接下来,我想到的只是一个简单的打印函数,它将显示整个names.txt文件


最后,我丢失了110%的部分…我该怎么按相反的顺序列出这些名字呢?我会用什么?递归如何适应这一切?

您可以使用
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);
}
只需从main调用
readFile()

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

递归部分的伪代码:

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”]

大概是这样的:

Reader(Stream strm)
{
    string line;

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

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

递归将在文件末尾停止并开始展开。最后一条信息将首先打印。

我不擅长扫描,但使用Sailator的扫描仪,您可以按如下方式完成其余部分

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));
}
私人扫描仪;
静态映射计数=新HashMap();
公共静态void main(字符串[]args){
扫描仪=新扫描仪(新文件(“myText.txt”);
readFile();
系统输出打印项次(计数);
}
私有void readFile(){
如果(!scanner.hasNext())返回;
字符串行=scanner.nextLine();
字符串[]名称=line.split(([\\W\\s]+)”;
对于(inti=0;i做这样的事情

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 object

来训练我的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());
    }
}

如果这是家庭作业,你需要用
家庭作业
@Sean]标记;它正在被删除。我被纠正了,哎呀。没有更多的家庭作业标记。(如果是这样,我仍然认为最好是提前知道,这几乎肯定是家庭作业。)我知道,很晚才回复。我理解不为人们做家庭作业背后的道德,但我问了一些本来可以回答的直截了当的问题,而不是说“它正在被移除”。是的,是hwk。自从我的编程伙伴让我孤身一人以来,我一直在寻求建议和指导。是的,有很多学生在stack上发布hwk问题以获得简单的答案,但我不是其中之一,不给我的帖子一个机会并立即提交移除,这使得该网站不受欢迎,也不符合其使命声明()
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());
    }
}
    import java.util.Scanner;
    import java.io.*;
  class Listnames{
   public static void recursiveRead(Scanner scanner) {
      String name; 
      if(scanner.hasNext())   
       {name=scanner.next();
        recursiveRead(scanner);
       System.out.println(name.length() +" "+ name);  
       }
   }

  public static void main(String[] args)
 {
 try{
    Scanner scanner=new Scanner(new File("name.txt"));
    scanner.useDelimiter(System.getProperty("line.separator"));

   recursiveRead(scanner); 
   }
catch (FileNotFoundException e) {
      e.printStackTrace();
      }
 }
}