簡體   English   中英

在循環中跳出遞歸函數,但讓循環繼續進行

[英]jump out of recursive function in a loop but let the loop continue

我正在嘗試從具有名稱和電話號碼的文本文件中讀取文件,其中也可以包含其他文本文件(包括自身)

myBook.txt:

7
name1 123-456-7890
name2 098-765-4321
name3 135-792-4680
name4 246-801-3579
PHONEBOOK-FILE myBook2.txt
name5 147-025-8369
name6 150-263-7495

myBook2.txt:

1
Name7 000-222-3332

第一行是文件中的項目數,然后它具有PHONEBOOK-FILE來表示另一個文件。

我不能使用數組,不能更改myBook.txt,不能使用try / catch,並且必須使用遞歸

這是我的代碼:

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

public class Phonebook
{
private boolean DEBUG = true;
private Scanner scan;
private Scanner input;
private File file;
private File holder;
private String query;
private boolean bottomOut;
private int nameCount;
private String fileNameHold;

// entry point for class
public void run()throws IOException
{
    input = new Scanner(System.in); 

    //Gets file name and checks if it exists valid file
    while(true)
    {
        System.out.print("Name of phone book to read in: ");
        fileNameHold = input.next();
        file = new File(fileNameHold);
        if(file.exists())
            break;
        else
            System.out.println("That file does not exist!");
    }   
    System.out.println("Phonebook successfully read in!");

    //Main control loop
    while(true)
    {
        bottomOut = false;
        System.out.print("Please enter person to search for: ");
        query = input.next();
        if(query.equals("."))
            break;
        file = new File(fileNameHold);
        System.out.println(doWork(query, file, 0));
    }

    System.out.print("Thank you for using this program!");
    }

    //Does the searching and recursive stuff
    private String doWork(String query, File fileName, int level)throws IOException
    {
    scan = new Scanner(fileName);

    //Grabs item count fom begining of file
    //if(!bottomOut)
    nameCount = Integer.parseInt(scan.nextLine());
    String line = "";

    //Runs through entries
    for(int i=0; i<nameCount; i++)
    {   
        line = scan.nextLine();
        debug("file: " +file);
        debug("line: " + line);
        debug("nameCount: " + nameCount);

        if(line.toLowerCase().contains(query.toLowerCase()))
        {

            return line;
        }
        //Recursion is used to searth through linked files
        else if(line.contains("PHONEBOOK-FILE"))
        {
            //System.out.println("Sanity Check");
            holder = new File(line.replace("PHONEBOOK-FILE ", ""));
            if(level < 2 || (level > 0 && bottomOut))
                return doWork(query, holder, ++level);

            else if(level >= 2 && !bottomOut)
                bottomOut = true;

            else
                return "not found (REC)";

        }

    }
    return "not found";
    }

    private void debug(String stuff)
    {
        if(DEBUG)
            System.out.println("[[--DEBUG--]] " + stuff);
    }
}

我認為問題出在doWork中,但我可能是錯的。 它正在執行的操作是遍歷文件,直到到達指定的底部為止,如果未找到該底部,則應中斷該遍歷,並繼續傳遞PHONEBOOK-FILE行。

當前,如果您搜索的是通過該行的名稱(如果找不到返回)。 它似乎不是來自遞歸。

您可能會告訴我,這不是很好。 謝謝你的幫助。

對於文件中的每一行,您將要計算一個值。 找不到或電話簿中的一行。 如果得到一條線路,您可以跳出循環。 無論哪種方式,在循環之后,您都將返回值:您獲得或未找到的行;或者

棘手的是如何計算引用另一電話簿的線路,答案是您只是使用該電話簿調用方法。 那是遞歸部分。

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

public class Phonebook
{
private Scanner input;
private File file;
private String query;

// entry point for class
public void run()throws IOException
{
    input = new Scanner(System.in); 

    //Gets file name and checks if it exists valid file
    while(true)
    {
        System.out.print("Name of phone book to read in: ");
        fileNameHold = input.next();
        file = new File(fileNameHold);
        if(file.exists())
            break;
        else
            System.out.println("That file does not exist!");
    }   
    System.out.println("Phonebook successfully read in!");

    //Main control loop
    while(true)
    {
        bottomOut = false;
        System.out.print("Please enter person to search for: ");
        query = input.next();
        if(query.equals("."))
            break;
        file = new File(fileNameHold);
        System.out.println(doWork(query, file));
    }

    System.out.print("Thank you for using this program!");
    }

    //Does the searching and recursive stuff
    private String doWork(String query, File fileName)throws IOException
    {
    Scanner scan = new Scanner(fileName);
    int nameCount;
    File recurFile;

    nameCount = Integer.parseInt(scan.nextLine());
    String line = "";
    String value = "Not found";
    //Runs through entries
    for(int i=0; i<nameCount; i++)
    {   
        line = scan.nextLine();
        // if the line is a file, then the value of that line
        // is the result to your function applied to that new file
        if(line.contains("PHONEBOOK-FILE")) {
            recurFile = new File(line.replace("PHONEBOOK-FILE ", ""));
            line = doWork(query, holder, ++level);
        }  
        // the file will either return Not found or
        // a line corresponding to your query
        if(line.toLowerCase().contains(query.toLowerCase()))
        {
            // Your line is correct. The function doesn't care where it comes from
            value = line;
            break;
        }

    }
    return value;
    }


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM