写入文件和搜索数组的问题

时间:2013-12-02 04:00:23

标签: java arrays file loops

对于任何错误,我很抱歉,我尝试做一些更正,以便更容易理解我在做什么以及我需要什么帮助。我是java和这个网站的新手。

我正在尝试编写一个程序,将5个单独文件中的状态(州名,州名昵称,州人口,州花和州首府)的数据组织成五个独立的并行数组。代码将要求输入并向用户提供使用逗号格式化的填充数据。我还创建了一种将所有信息写入输出文件的方法。

我遇到了一些问题。

我想知道我是否能在一些问题上得到帮助?

首先,运行代码后,文件state_data.txt为空。

其次,如果您在askState方法中输入无效选项而不是要求新输入,我的程序会崩溃

我很感激任何帮助!

 import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    import java.util.Scanner;

    /**
     *

     */

public class Project_3a {

    /**
     * @param args the command line arguments
     */
    static final int NUM_STATES = 50;

    public static void main(String[] args) throws FileNotFoundException {
        String[] stateNames = importFile("stateNames.txt");
        String[] nicknames = importFile("nicknames.txt");
        String[] populations = importFile("population.txt");
        String[] flowers = importFile("flowers.txt");
        String[] capital = importFile("capitals.txt");
        for (int x = 0; x < NUM_STATES; x++) 
         {

         createFile(stateNames, nicknames, capital, flowers, populations);
         char getWantsToContinue = 'y'; 
         while (getWantsToContinue == 'y' || getWantsToContinue == 'Y') 
         { 
           System.out.println(stateNames); 
           int index = askState(stateNames); 
           String unformattedPopulation = populations[index]; 
           String formattedPopulation = formatPopulation(unformattedPopulation);                   
           outPut(stateNames,nicknames, capital, flowers, formattedPopulation,index);             
         }
         getWantsToContinue = again();
    }

    public static String[] importFile(String fileName) throws
            FileNotFoundException {

        String[] array = new String[NUM_STATES];

        File inputFile = new File(fileName);
        Scanner scanner = new Scanner(inputFile);


        for (int i = 0; i < NUM_STATES; i++) {
            array[i] = scanner.nextLine();

        }
        return array;

    }

    public static int askState(String[] stateNames) {
        Scanner keyboard = new Scanner(System.in);
        String state;
        int statePosition = -1;
        System.out.println("Please enter a state that you would like to search:");
        state = keyboard.nextLine();
        {
            for (int i = 0; i < NUM_STATES; i++) {
                if (state.equals(stateNames[i])) {
                    statePosition = i;
                    return statePosition;
                }
            }
            System.out.println("Please enter a valid state:");

        }
        return statePosition;
    }

    public static String formatPopulation(String population) {
        String formattedPopulations = "";
        {
            for (int i = population.length() - 1; i >= 0; i--) {
                formattedPopulations = population.charAt(i) + formattedPopulations;
                if (i % 3 == 2 && (i + 1 != population.length())) {
                    formattedPopulations = "," + formattedPopulations;
                }
            }
            return formattedPopulations;
        }

    }

    public static void createFile(String[] stateNames, String[] nicknames,
            String[] capitals, String[] flowers, String[] populations) throws FileNotFoundException {
        PrintWriter stateData = new PrintWriter("state_data.txt");
        for (int i = 0; i < NUM_STATES; i++) {
            stateData.println(stateNames[i] + "\t" + nicknames[i] + "\t" + capitals[i]
                    + "\t" + flowers[i] + "\t" + formatPopulation(populations[i]) + "\n");
        }
        stateData.close();
    }

    public static void outPut(String[] stateNames, String[] nicknames,
            String[] capitals, String[] flowers, String formattedPopulation,
            int index) {
        System.out.println("State Name: " + stateNames[index]);
        System.out.println("Nickname: " + nicknames[index]);
        System.out.println("Capital: " + capitals[index]);
        System.out.println("Flower: " + flowers[index]);
        System.out.println("Population: " + formattedPopulation);
    }

    public static char again() {
        Scanner keyboard = new Scanner(System.in);

        char getWantsToContinue;
        System.out.println("Would you like to search another state?");
        System.out.println("Please enter Y for yes or N for no.");
        getWantsToContinue = keyboard.next().charAt(0);
        while (getWantsToContinue != 'y' && getWantsToContinue != 'Y'
                && getWantsToContinue != 'n' && getWantsToContinue != 'N') {
            System.out.println("Please enter a valid option (Yor N).");
            getWantsToContinue = keyboard.next().charAt(0);
        }
        if (getWantsToContinue == 'n' || getWantsToContinue == 'N') {
            System.out.println("Goodbye!");
        }

        return getWantsToContinue;

    }
}

2 个答案:

答案 0 :(得分:0)

我只想添加我在代码中发现的问题。

(1)。我发现的第一个问题是函数importFile

  for (int i = 0; i < NUM_STATES; i++) {
        array[i] = scanner.nextLine();

    }

这个循环对我来说是错误的。您正尝试从文件中扫描一行50次,并希望将其存储在字符串的索引位置。这很荒谬。 另外,你真的确定你必须经常运行循环50次吗? (这对我来说也是错误的)。

所以,在我看来,我认为你打算从文件1中读取50个字符并将其放入大小为50的字符串数组中,这意味着你必须一次读取一个字符。

所以我清除这个问题的建议是:

(a). Read one character at a time.
(b). If you are not sure about the size of each file, iterate through it till the EOF.

(2)。我在createFile方法中找到的第二个问题。

您正在创建一个新文件并插入所有文件中的第一个字符。然后是第二个。然后第三个......直到第50个字符。

如果相应的文件在第50个字符之前没有任何数据,该怎么办?这将在结果文件中输入错误数据。 这可能不会导致编译时异常,但可能导致运行时异常,这是不合需要的。

(3)。在main方法中:

     for (int x = 0; x < NUM_STATES; x++) 
         {

         **createFile(stateNames, nicknames, capital, flowers, populations);**
         char getWantsToContinue = 'y'; 
         while (getWantsToContinue == 'y' || getWantsToContinue == 'Y') 
         { 
           System.out.println(stateNames); 
           int index = askState(stateNames); 
           String unformattedPopulation = populations[index]; 
           String formattedPopulation = formatPopulation(unformattedPopulation);                   
           outPut(stateNames,nicknames, capital, flowers, formattedPopulation,index);             
         }

这意味着调用createFile方法50次。哪个总是创建相同的“state_data.txt”文件50次? (这是为了什么?)

寻找其他问题。同时,开始努力纠正它。

答案 1 :(得分:0)

可能您对如何使用Scanner实例来读取文件感到困惑。在importFile方法中,您假设至少有50行数据并使用scanner.nextLine()进行读取。你必须检查是否有下一行然后再读它,当没有下一行时它会抛出NoSuchElementException。代码应该是

while(scanner.hasNext()){
scanner.next();
}

  while(scanner.hasNextLine()){
    scanner.nextLine();
    }

同样,在您的createFile方法中,您确定所有参数String arrays的长度为50吗? For循环始终被编程为运行50次,以创建String文字,并假定传递给该方法的所有数组的50个索引值(0-49)。如果找不到索引值,这将导致RuntimeException - ArrayIndexOutOfBoundException。您需要通过在执行此操作之前检查所有数组length应该是50来处理此问题。您最好使用StringBuilder而不是连接String instance inside a循环. In your askState`方法,当用户键入时,您没有条件循环来重新请求输入无效的状态。

while(invalidState(state)){
System.out.println("Please enter input");
state = keyboard.nextLine();
}

另一个重要的事情是你要调用createFile方法五十次,因为你拥有数组中的所有各种文件数据,所以根本不需要它。将数组传递给createFile方法一次就足够了,然后编写逻辑以将总数据的写入操作转换为单个文件

for (int x = 0; x < NUM_STATES; x++) 
         {

         createFile(stateNames, nicknames, capital, flowers, populations);

我建议你必须完全调试你的程序,以确保你的代码以你想象的方式工作。希望这有帮助