【问题标题】:How to parse lines of code with multiple data types如何解析具有多种数据类型的代码行
【发布时间】:2019-10-12 23:24:52
【问题描述】:

目前正在开发一个程序,该程序读取足球运动员的统计数据并将数据转换为二进制并将其全部写入文件。我遇到的问题是解析我正在读取的文件包含的所有不同数据类型。我正在阅读的文件将具有以下格式 - lastName yearsExp position height weight 40ydSpeed team active?文件如下所示:Brady, 14, QB, 1, 210, 4.9, Patriots, true 我想知道如何解析不同的数据类型,int、char、double、String 和 boolean。

到目前为止,我的程序要求用户输入一个文件,它会从无效文件中捕获任何 FileNotFoundExceptions 并循环,直到输入一个有效文件。然后程序读取文件并将其全部存储到列表中。

public static void main(String[] args) throws IOException {
     File file;
     Scanner inputFile;
     Scanner readFile;
     String line;
     String fileName;
     int x = 1;

     ArrayList<String> stats = new ArrayList<String>();

    do {
        Scanner kb = new Scanner(System.in);
        System.out.println("Please enter the name of a " +
                "file containing football player data:");
        fileName = kb.nextLine();

        try {
            file = new File(fileName);
            inputFile = new Scanner(file);
            while(inputFile.hasNext()) {

                    stats.add(inputFile.nextLine());
            }
            x=2;

        }
        catch (FileNotFoundException e)
            {
            System.out.print("File not found. ");
            }
       }
    while(x==1);

    for (String s : stats) {
        System.out.println(s);
    }

    // TODO use the following methods for writing to binary
    // TODO writeUTF, writeInt, writeChar, writeInt, writeInt, writeDbl, writeByte

【问题讨论】:

  • 看起来值是用逗号分隔的,所以我建议你使用 CSV 解析器(CSV = Comma-Separated-Values)。
  • 在我看来,您应该创建一个 Player 类并使用它。无论如何,您以后很可能需要它来处理数据。

标签: java exception file-io binary


【解决方案1】:

如何解析不同的数据类型,int、char、double、String 和 boolean

按顺序:

int x = Integer.parseInt(s)
char x = s.charAt(0)
double x = Double.parseDouble(s)
String x = s
boolean x = Boolean.parseBoolean(s)

【讨论】:

    【解决方案2】:

    当前的问题是ArrayList&lt;String&gt; stats = new ArrayList&lt;String&gt;(); 将您读取的任何值强制为String。如果您了解类,那么您可以创建一个模拟足球运动员的类​​:我们称之为FootballPlayer 作为示例。

    FootballPlayer 中,您将拥有许多不同类型的字段。您将有一个lastName,即StringyearsExp,即int,等等。

    那么,这里:

     while(inputFile.hasNext()) {
         stats.add(inputFile.nextLine());
     }
    

    您可以保留与您要读取的字段相对应的索引。 lastName 可以对应于index 0,yearsExpr 对应于 1,等等。然后,根据索引值(您可以使用 switch 语句),您可以调用 Scanner 的不同方法,该方法返回适当的类型,如 nextInt(),如果索引为 1(对于 yearsExpr)。调用此适当方法后,您会将返回的值分配给FootballPlayer 实例中的相应字段。

    将来,整个过程可以通过使用库来解析您正在使用的数据格式,例如 CSV 解析器(因为看起来您的数据是逗号分隔的)。

    【讨论】:

      【解决方案3】:

      您可以通过, 或任何其他分隔它们的常用分隔符来拆分输入,然后尝试逐一解析。

      String input = "Tom, 15, 6, 86.4"; // name, age, grade, mark
      String[] inputs = input.split(", "); // [ Tom, 15, 6, 86.4 ]
      
      for (String in : inputs) {
          if (isInteger(in)) {
              // something
          } else if (isString(in)) {
              // other thing
          } // etc
      }
      

      【讨论】:

        猜你喜欢
        • 2022-11-28
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多