设计一个将以文件名读取的程序。从该文件中,程序将读入由空格分隔的字符串列表。这些字符串将转换为十进制等值并进行平均。然后程序将结果输出到另一个文件。
程序还应该能够优雅地处理输入错误,例如错误的文件名或不包含小数值的字符串数据。
似乎无法弄明白该怎么做'该程序将读入由空格分隔的字符串列表。这些字符串将转换为十进制等值并进行平均。然后程序将结果输出到另一个文件。
和
'该程序还应该能够优雅地处理输入错误,例如错误的文件名或不包含小数值的字符串数据。
如果有人能解释或指导我在哪里找到这些例子,我会非常感激。
public static void main (String [] args) throws Exception{
//Create a Scanner object
Scanner input = new Scanner (System.in);
//prompt the user to enter a file name
System.out.println("Enter a file name: ");
File file = new File (input.nextLine());
// Read text from file and change oldString to newString
try (
// Create input file
Scanner input = new Scanner(file);
) {
while (input.hasNext()) {
String s1 = input.nextLine();
list.add(s1.replaceAll(args[1], args[2]));
}
}
// Save the change into the original file
try (
// Create output file
PrintWriter output = new PrintWriter(file);
) {
for (int i = 0; i < list.size(); i++) {
output.println(list.get(i));
}
}
}
您寻求的示例遍布StackOverflow。您只需选择一个特定问题并进行研究。
在创建控制台应用程序时,您应该尽可能使用户友好,因为控制台几乎对所有内容都有限制。当提示用户输入时,如果发生输入错误,则允许用户多次尝试。 while循环通常用于此类事情,这是一个示例:
//Create a Scanner object
Scanner input = new Scanner(System.in);
System.out.println("This application will read the file name you supply and");
System.out.println("average the scores on each file line. It will then write");
System.out.println("the results to another file you also supply the name for:");
System.out.println("Hit the ENTER Key to continue (or q to quit)....");
String in = "";
while (in.equals("")) {
in = input.nextLine();
if (in.equalsIgnoreCase("q")) {
System.out.println("Bye-Bye");
System.exit(0);
}
break;
}
// Prompt the user to enter a file name
String fileName = "";
File file = null;
while (fileName.equals("")) {
System.out.println("Enter a file name (q to quit): ");
fileName = input.nextLine();
if (fileName.equalsIgnoreCase("q")) {
System.out.println("Bye-Bye");
System.exit(0); // Quit Application
}
// If just ENTER key was hit
if (fileName.equals("")) {
System.out.println("Invalid File Name Provided! Try Again.");
continue;
}
file = new File(fileName);
// Does the supplied file exist?
if (!file.exists()) {
// Nope!
System.out.println("Invalid File Name Provided! Can Not Locate File! Try Again.");
fileName = ""; // Make fileName hold Null String ("") to continue loop
}
}
至于向用户询问文件名,上面的代码是一种更友好的方法。首先,它基本上解释了应用程序的作用,然后允许用户在他/她希望的情况下退出应用程序,并且允许用户在出现错误条目时提供正确的条目或者看起来有效的条目实际上是发现有问题,例如无法找到特定文件时。
应该将相同的概念应用于控制台应用程序的所有方面。最重要的是,您创建了应用程序,因此您知道预期的内容,但对于使用您的应用程序的人来说,这是不可能的。他们完全不知道预期的结果。
至于手头的任务,你需要利用你已经学过的代码和概念,以及那些你还没有通过研究和实验其他算法代码概念学习的代码和概念。在此过程中,您将跳出一定程度的“思维开箱即用”,这个特性实际上会变得很自然,您最终会学到更多的代码和概念。
写下有条不紊的攻击计划以完成任务。随着代码的进展,这可以为您节省大量的悲伤,例如:
"\\s+"
)方法将每个读入行拆分为String Array;
将totalSum变量声明为double数据类型;
将平均变量声明为double数据类型;
使用for循环遍历String Array;
使用String#matches("-?\\d+(\\.\\d+)"
)方法确保每个Array元素都是十进制值;
将每个数组元素转换为double并添加到** totalSum *;
for循环将totalSum除以数组中的元素数得到平均值后,将该量放入平均变量;
写入文件:“平均值:”+ fileLine +“是:”+平均值。同时显示到控制台;现在,这将是您创建应用程序的基本指南。
当使用Scanner读取数据文件时,我觉得最好在while循环条件下使用Scanner#hasNextLine()方法而不是Scanner#hasNext()方法,因为这种方法更侧重于获取令牌而不是文件行。所以这在我看来是更好的方法:
String outFile = "";
// Write code to get the File Name to write to and place
// it into the the variable outFile ....
File outputFile = new File(outFile); // True file name is acquired from User input
if (outputFile.exists()) {
// Ask User if he/she wants to overwrite if file exists....and so on
}
// 'Try With Resourses' on reader
try (Scanner reader = new Scanner(file)) {
// 'Try With Resourses' on writer
try (PrintWriter writer = new PrintWriter(outputFile)) {
String line = "";
while (reader.hasNextLine()) {
line = reader.nextLine().trim();
// Skip blank lines (if any)
if (line.equals("")) {
continue;
}
// Split the data line into a String Array
String[] data = line.split("\\s+"); // split data on one or more whitespaces
double totalSum = 0.0d; // Hold total of all values in data line
double average = 0.0d; // To hold the calculated avarage for data line
int validCount = 0; // The amount of valid data values on data line (used as divisor)
// Iterate through data Line values String Array
for (int i = 0; i < data.length; i++) {
// Is current array element a string representation of
// a decimal value (signed or unsigned)
if (data[i].matches("-?\\d+(\\.\\d+)")) {
// YES!...add to totalSum
validCount++;
// Convert Array element to double then add to totalSum.
totalSum += Double.parseDouble(data[i]);
}
else {
// NO! Kindly Inform User and don't add to totalSum.
System.out.println("An invalid value (" + data[i] + ") was detected within "
+ "the file line: " + line);
System.out.println("This invalid value was ignored during + "averaging calculations!" + System.lineSeparator());
}
}
// Calculate Data Line Average
average = totalSum / validCount;
// Write the current Data Line and its' determined Average
// to the desired file (delimited with the Pipe (|) character.
writer.append(line + " | Average: " + String.valueOf(average) + System.lineSeparator());
writer.flush();
}
}
System.out.println("DONE! See the results file.");
}
// Catch the fileNotFound exception
catch (FileNotFoundException ex) {
ex.printStackTrace();
}