2012-10-23 165 views
2

編寫一個遞歸讀取文件中10個名稱的Java程序,然後輸出名稱中的字符總數,名稱列表和列表名稱的順序相反。所有循環都必須遞歸執行。用Java讀取文本文件並用遞歸向後打印

傑伊·沃克
埃羅爾打火石
C.埃羅爾德雷
比利香客
米奇天使
何塞弗朗西斯科·聖馬丁
Squarebob海綿褲子
米沙Ternoff
切斯特峯值
鋁意大利
Ben Dover
Pat Pending

我100%失去。我想就如何從第一個地方開始提出建議。考慮到這個計劃,我想要構建一個,它會調用掃描器,它將首先讀取文件。讀取文件時,它會計算文本中的字符(快速問題,掃描儀會計算字符之間的空格?)。

接下來,我想只是一個簡單的打印功能,將顯示整個names.txt中文件。

最後,我失去了110%的部分...我怎麼會按照相反的順序列出名字?我會用什麼?遞歸如何適合所有這些?

+0

如果這是家庭作業,您需要用'作業'標記。 –

+1

@Sean,[不,你沒有](http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated);它正在被刪除的過程中。 – Ben

+0

我站好了,哎呀。沒有更多的作業標籤。 (我仍然認爲如果可以的話,很高興能夠這樣做,而且這幾乎肯定是功課。) –

回答

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(); 
} 
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"]) 
3

像這樣:

Reader(Stream strm) 
{ 
    string line; 

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

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

遞歸將停止在文件的結尾和將開始展開。最後一條消息將首先打印。

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

做這樣的事情,我路過BR對象本

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


    } 

} 

通知

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