对于任何错误,我很抱歉,我尝试做一些更正,以便更容易理解我在做什么以及我需要什么帮助。我是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;
}
}
答案 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);
我建议你必须完全调试你的程序,以确保你的代码以你想象的方式工作。希望这有帮助