如何将两种方法放在一起?

时间:2014-05-06 22:37:34

标签: java

我正在创建一个程序,询问用户输入和输出的名称。代码是询问用户输入文件和输出文件的名称。这将分为不同的方法。一个将被称为getInputFileName(),另一个将被称为getOutputFileName(),它们都将返回String对象。方法标题如下:

public static String getInputFileName()

public static String getOutputFileName()

这两种方法都会要求用户输入相应的文件名并将该名称作为String返回。这些方法将从main方法调用。它们返回一个String,因此它应该在调用方法之前声明两个String变量。

程序的其余部分应包含在另一种方法中。此方法标题如下:

public static void processTickets(String inputFileName, String outputFileName)

我正在尝试将2个方法inputFileNameoutputFile名称放在一起,但我不断收到错误。

当它们是单独的方法时,这是程序:

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());
}
}

4 个答案:

答案 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)

getInputFileNamegetOutputFileName是无用的,除非您实际使用他们检索的文件名执行某些操作。

在第一个版本中,您将这些方法声明为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)

我认为你只是误解了这项任务。你试图做的是:

  1. 创建一个返回void <{li>的getInputFileName
  2. 创建一个返回void <{li>的getOutputFileName
  3. 创建一个可以完成所有操作的main方法
  4. 将上述所有内容整合到processTickets方法中。
  5. 练习的目的是通过分离用户输入和处理使程序更加模块化,所以你应该做的是:

    1. 创建一个要求的getInputFileName并返回一个字符串
    2. 创建一个要求的getOutputFileName并返回一个字符串
    3. 创建一个processTickets,它接受​​两个String文件名并对其进行处理。
    4. 创建一个结合了三个
    5. 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());
          }
        }
      

      当一切都是一种方法时,这些变化就更难了。