2

ファイルから 10 個の名前を再帰的に読み取り、名前の合計文字数、名前のリスト、名前のリストを逆順に出力する 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%失われています。最初にどこから始めればよいかアドバイスをお願いします。プログラムについて考えて、最初にファイルを読み取るスキャナを呼び出すメインを構築したいと考えました。ファイルを読み取るとき、テキスト内の文字をカウントします (簡単な質問ですが、スキャナーは文字間のスペースをカウントしますか?)。

次に、 names.txtファイル全体を表示する単純な印刷機能を考えていました。

最後に、私は 110% 迷子になっているという部分です... 名前を逆順に並べるにはどうすればよいでしょうか? 何を使用しますか?再帰はこれらすべてにどのように適合しますか?

4

7 に答える 7

3

再帰部分の擬似コード:

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"])
于 2012-10-23T08:10:25.267 に答える
3

このようなもの:

Reader(Stream strm)
{
    string line;

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

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

再帰はファイルの最後で停止し、展開を開始します。最後のメッセージが最初に印刷されます。

于 2012-10-23T08:13:09.407 に答える
1

私はスキャンが苦手ですが、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));
}
于 2012-10-23T08:16:57.753 に答える
1

私の 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());
    }
}
于 2012-10-23T08:32:24.873 に答える
1

でファイルを読み取ることができます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();
}
于 2012-10-23T08:10:00.937 に答える
0

このようなことをする

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 オブジェクトを渡していることに注意してください

于 2012-10-23T08:30:00.040 に答える
0
    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();
      }
 }
}
于 2012-10-23T09:06:22.580 に答える