我正在创建一个程序,询问用户输入和输出的名称。代码是询问用户输入文件和输出文件的名称。这将分为不同的方法。一个将被称为getInputFileName(),另一个将被称为getOutputFileName(),它们都将返回String对象。方法标题如下:
public static String getInputFileName()
public static String getOutputFileName()
这两种方法都会要求用户输入相应的文件名并将该名称作为String返回。这些方法将从main方法调用。它们返回一个String,因此它应该在调用方法之前声明两个String变量。
程序的其余部分应包含在另一种方法中。此方法标题如下:
public static void processTickets(String inputFileName, String outputFileName)
我正在尝试将2个方法inputFileName
和outputFile
名称放在一起,但我不断收到错误。
当它们是单独的方法时,这是程序:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class WebberProject3Test1 {
private static Map<String, Integer> ticketTypeToPrice = new HashMap<String, Integer>();
private static final String SPACE = " ";
private static final String CURRENCY_SYMBOL = " $";
public static void getInputFileName() {
// Create Scanner object for keyboard input.
Scanner keyboard = new Scanner(System.in);
//Get the file name
System.out.println("Enter the input filename here : ");
String filename = keyboard.nextLine();
//Open the file.
File file = new File(filename);
System.out.println(filename);
}
public static void getOutputFileName() {
// Create Scanner object for keyboard input.
Scanner keyboard = new Scanner(System.in);
//Get the file name
System.out.println("Enter the output filename here : ");
String filename = keyboard.nextLine();
//Open the file.
File file = new File(filename);
System.out.println(filename);
}
public static void main(String[] args) {
Scanner scanner = null;
PrintWriter outputFile = null;
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMinimumFractionDigits(2);
getInputFileName();
getOutputFileName();
try {
File file = new File("portlandvip2.txt");
scanner = new Scanner(file);
outputFile = new PrintWriter("portland2out.txt");
while (scanner.hasNext()) {
String line = scanner.nextLine();
String[] entriesOnLine = line.split(" ");
// Line with price and ticket type
if (entriesOnLine.length == 2) {
ticketTypeToPrice.put(entriesOnLine[0], Integer.parseInt(entriesOnLine[1]));
StringBuilder sb = new StringBuilder();
sb.append(entriesOnLine[0])
.append(CURRENCY_SYMBOL)
.append(decimalFormat.format(Integer.parseInt(entriesOnLine[1])));
outputFile.println(sb.toString());
} else if (entriesOnLine.length == 4) {
//Line with First Name, Last Name, number of Tickets and Price
int numberOfTickest = Integer.parseInt(entriesOnLine[2]);
int ticketPrice = ticketTypeToPrice.get(entriesOnLine[3]);
int totalPrice = numberOfTickest * ticketPrice;
StringBuilder sb = new StringBuilder();
sb.append(entriesOnLine[0])
.append(SPACE)
.append(entriesOnLine[1])
.append(CURRENCY_SYMBOL)
.append(decimalFormat.format(totalPrice));
outputFile.println(sb.toString());
}
}
} catch (IOException e) {
System.out.println("exception:" + e);
} finally {
scanner.close();
outputFile.close();
}
}
}
这是我尝试将方法放在一起后的程序:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class WebberProject3Test3 {
private static Map<String, Integer> ticketTypeToPrice = new HashMap<String, Integer>();
private static final String SPACE = " ";
private static final String CURRENCY_SYMBOL = " $";
final static Scanner scanner = new Scanner(System.in);
public static String getInputFileName() {
System.out.print("Enter input file: ");
return scanner.nextLine();
}
public static String getOutputFileName() {
System.out.print("Enter output file: ");
return scanner.nextLine();
}
public static void processTickets(String inputFileName, String outputFileName)
{
Scanner scanner = null;
PrintWriter outputFile = null;
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMinimumFractionDigits(2);
try {
File file = new File(inputFileName);
scanner = new Scanner(file);
outputFile = new PrintWriter("portland2out.txt");
while (scanner.hasNext()) {
String line = scanner.nextLine();
String[] entriesOnLine = line.split(" ");
// Line with price and ticket type
if (entriesOnLine.length == 2) {
ticketTypeToPrice.put(entriesOnLine[0], Integer.parseInt(entriesOnLine[1]));
StringBuilder sb = new StringBuilder();
sb.append(entriesOnLine[0])
.append(CURRENCY_SYMBOL)
.append(decimalFormat.format(Integer.parseInt(entriesOnLine[1])));
outputFile.println(sb.toString());
} else if (entriesOnLine.length == 4) {
//Line with First Name, Last Name, number of Tickets and Price
int numberOfTickest = Integer.parseInt(entriesOnLine[2]);
int ticketPrice = ticketTypeToPrice.get(entriesOnLine[3]);
int totalPrice = numberOfTickest * ticketPrice;
StringBuilder sb = new StringBuilder();
sb.append(entriesOnLine[0])
.append(SPACE)
.append(entriesOnLine[1])
.append(CURRENCY_SYMBOL)
.append(decimalFormat.format(totalPrice));
outputFile.println(sb.toString());
}
}
} catch (IOException e) {
System.out.println("exception:" + e);
} finally {
scanner.close();
outputFile.close();
}
}
public static void main(String[] args) {
processTickets(getInputFileName(), getOutputFileName());
}
}
答案 0 :(得分:0)
你不能以这种方式嵌套方法。
似乎您想在processTickets
内按此顺序调用这两种方法。
public static void processTickets(String inputFileName, String outputFileName){
getInputFileName();
getOutputFileName();
}
另外,我会尝试重用相同的Scanner
对象。在每个方法中创建一个新的Scanner
并不是一个好主意。尝试将它变成一个类变量,在你的情况下可以正常,并初始化它只需一次。
答案 1 :(得分:0)
您可以将方法嵌套在类或类中的类中,但不能将方法放在方法中。使您的方法/函数全部在更高级别声明
public static void processTickets(String inputFileName, String outputFileName) {
// whatever you need to do for processing
}
public static String getInputFileName() {
// Input filename handling
}
public static String getOutputFileName() {
// Output filename handling
}
......然后......
public static void main(String[] args) {
processTickets(getInputFileName(), getOutputFileName());
}
答案 2 :(得分:0)
getInputFileName
和getOutputFileName
是无用的,除非您实际使用他们检索的文件名执行某些操作。
在第一个版本中,您将这些方法声明为void
。您从键盘输入文件名:
String filename = keyboard.nextLine();
但该变量仅存在于您的方法中。方法完成后,filename
消失,用户输入的任何输入都被抛弃。
在第二个版本中,您将方法从void
更改为String
:
public static String getInputFileName() {
(正如评论中所提到的,您必须将它们移到processTickets
之外。)现在您已经说过,getInputFileName
方法会将文件名作为String
返回。 (也就是说,它会将文件名返回给调用它的方法。)但是你没有返回任何内容。 Java会给你一个错误信息。要使它返回所需的字符串,该方法需要有一个return
语句,该语句返回您希望它返回的字符串。
添加return
没有用,但是,如果调用它的方法忽略文件名:
getInputFileName();
getInputFileName
返回一个文件名,但上面的语句告诉它只是抛出文件名。不好。您需要对结果执行某些操作,例如创建新变量来保存结果。当你说
String filename = keyboard.nextLine();
你需要做类似的事情才能使用getInputFileName()
的输出。
答案 3 :(得分:0)
我认为你只是误解了这项任务。你试图做的是:
getInputFileName
getOutputFileName
main
方法processTickets
方法中。练习的目的是通过分离用户输入和处理使程序更加模块化,所以你应该做的是:
getInputFileName
并返回一个字符串getOutputFileName
并返回一个字符串processTickets
,它接受两个String文件名并对其进行处理。main
方法
醇>
这是一个开始的框架代码:
import java.util.Scanner;
class Test {
final static Scanner scanner = new Scanner(System.in);
public static String getInputFileName() {
System.out.print("Enter input file: ");
return scanner.nextLine();
}
public static String getOutputFileName() {
System.out.print("Enter output file: ");
return scanner.nextLine();
}
public static void processTickets(String inputFileName, String outputFileName) {
/* All your processing code here */
}
public static void main(String[] args) {
processTickets(getInputFileName(), getOutputFileName());
}
}
以这种方式编写代码的目的是为了能够轻松地重用和更改程序。
例如,只需几行代码,我们就可以重写main方法,除了java Test input.txt output.txt
之外还允许运行java Test
并提示:
public static void main(String[] args) {
if(args.length == 2) {
processTickets(args[0], args[1]);
} else {
processTickets(getInputFileName(), getOutputFileName());
}
}
当一切都是一种方法时,这些变化就更难了。