Java 编程项目

Java programming project

我正在进行一个大学项目,任务是使用扫描仪读取几个数据文件的相应数据。该项目涉及一个超级class和几个子class。到目前为止,下面的方法可以完美运行并读取对应于名为 Tool 的 class 及其所有字段的数据。然而,我最近添加了一个 subclass ElectricTool 扩展 class Tool 并且还引入了两个新字段,需要以与以前相同的方式阅读但在相同的范围内方法如下所示。我已经尝试了很多事情,但我似乎无法弄清楚。有什么建议么?最好尽可能使用 clean/simple 代码,我认为它需要是一个读取语句,但我正在努力。方法如下:

public void readToolData()

{
    Frame myFrame = null;
    FileDialog fileBox = new FileDialog(myFrame,"Open", FileDialog.LOAD);
    fileBox.setVisible(true);
    String directoryPath = fileBox.getDirectory();
    String fileName = fileBox.getFile();

    File dataFile = new File(fileName);
    System.out.println(fileName +"  "+ directoryPath);
    Scanner scanner = null;
    try
    {
        scanner = new Scanner(dataFile);
    }
    catch (FileNotFoundException e)
    {
        System.out.println(e);
    }

    while( scanner.hasNextLine() )
    {
        String lineOfText = scanner.nextLine().trim().replaceAll("\s+","");
        if(!lineOfText.isEmpty() && !lineOfText.matches("^//.*") && !lineOfText.substring(0,1).equals("["))
        {
            System.out.println(lineOfText);      
        }
        else{
            continue;
        }

        Scanner scanner2 = new Scanner(lineOfText).useDelimiter("\s*,\s*");
        while(scanner2.hasNext())
        {
            Tool tool = new Tool();
            tool.readData(scanner2);


            storeToolList(tool);
        }

    }
    scanner.close();
}

electric tool class

tool class

data file

  public void readToolData() {
    Frame myFrame = null
    FileDialog fileBox = new FileDialog(myFrame, "Open", FileDialog.LOAD);
    fileBox.setVisible(true);
    String directoryPath = fileBox.getDirectory();
    String fileName = fileBox.getFile();

    File dataFile = new File(directoryPath + fileName);
    System.out.println(fileName + "  " + directoryPath);
    Scanner scanner = null;
    try {
      scanner = new Scanner(dataFile);
    } catch (FileNotFoundException e) {
      System.out.println(e);
    }

    // Current tool type
    String toolType = null;
    while( scanner.hasNextLine() ) {
      String lineOfText = scanner.nextLine().trim();

      // Skip empty lines and commentaries
      if(lineOfText.isEmpty() || lineOfText.startsWith("//")) {
        continue;
      }

      if (lineOfText.startsWith("[")) {
        // Extract the tool type name
        String withoutBracket = lineOfText.substring(1);
        // Split by spaces and take the first word
        String[] words = withoutBracket.split(" ");
        toolType = words[0];
        System.out.println("Reading information about " + toolType);
        continue;
      }

      System.out.println(lineOfText);

      Scanner scanner2 = new Scanner(lineOfText).useDelimiter("\s*,\s*");
      Tool tool = null;
      if ("ElectricTool".equals(toolType)) {
        tool = new ElectricTool();
      }
      // In the future here will come more cases for different types, e.g.:
      // else if ("HandTool".equals(toolType)) {
      //    tool = new HandTool();
      // }
      if (tool != null) {
        tool.readData(scanner2);
        storeToolList(tool);
      }
    }
    scanner.close();
  }

删除 Tool.readData 中的 scanner.skip 行:

public class Tool {

  public void readData(Scanner scanner) {
   toolName = scanner.next(); 
   itemCode = scanner.next(); 
   timesBorrowed = scanner.nextInt(); 
   onLoan = scanner.nextBoolean(); 
   cost = scanner.nextInt(); 
   weight = scanner.nextInt(); 
   scanner.skip(".*");   // Remove this line  
  }

}

并在 ElectricTool 中实现 readTool 方法:

 @Override
 public void readData(Scanner scanner) {
   super.readData(scanner);
   rechargeable = scanner.nextBoolean();
   power = scanner.next(); // Or nextInt? what is the type of power field?
 }

要打印有关您应该使用多态性的工具的信息。 像这样修改 Shop.java 中的 printAllTools 方法:

public void printAllTools() {
  System.out.println("Information");
  System.out.println("---------->");
  for (Tool t : toolList) {
    System.out.println("You have selected:\n");
    t.printDetails();
  }
}

现在,Tool.java 中的方法 printDetails 必须如下所示:

public void printDetails() {
  System.out.println("Tool name: " + toolName + "\n" +
    "Item code: " + itemCode + "\n" +
    "Times borrowed: " + timesBorrowed + "\n" +
    "On load: " + onLoan + "\n" + 
    "Cost: " + cost + "\n" +
    "Weight: " + weight + "g\n"
  );
}

在电动车中Tool.java:

public void printDetails() {
  super.printDetails();
  System.out.println("Rechargeable: " + rechargeable + "\n" +
   "Power: " + power + "\n"
  );
}