【问题标题】:How to read tokens x and y如何读取标记 x 和 y
【发布时间】:2013-07-08 17:58:07
【问题描述】:

我从网上找到的一本书开始学习 Java。我解决了很多练习,但我在这一项中很累。我的问题是,我找不到关于如何告诉程序如果您读取“x”,您找到的下一个整数添加到sumx 的答案。如果你读到“y”,你会发现下一个整数添加到sumy。下面是问题和我的代码。

假设一个文本文件如下所示:

x= 10
y= -45
y= 98
x= 13
x= 37
y= 36
x= -2

。 . .

每一行都以“x=”或“y=”开头,但其中哪一个以不遵循任何模式。每一个后面跟一个空格,然后是一个整数。一行中的整数后面没有其他内容。

编写一个程序,读取该数据文件并计算 x 值的总和和 y 值的总和。提示:使用 hasNext() 和 next() 读取 "x=" 和 "y=" 标记,然后使用 nextInt() 读取整数。您还需要 String 的 equals() 方法。

import java.util.Scanner;
import java.io.*;
class Separatesums {
    public static void main(String[] args) throws IOException {
        int sumx = 0, sumy = 0, num = 0;

        File file = new File("input.txt");
        Scanner scan = new Scanner(file);

        while (scan.hasNext()) {
            if (scan.hasNext.equals("x")) {
                num = scan.nextInt();
                sumx = sumx + num;
            } else {
                if (scan.hasNext.equals("y")) {
                    num = scan.nextInt();
                    sumy = sumy + num;
                }
            }
        }
        System.out.println("Sum x is: " + sumx + " Sum y is: " + sumy);
    }
}

【问题讨论】:

  • 是的 y= -45 不是 y=-45 我的错误。我想从每一行获取号码
  • @user2561683 查看我的代码

标签: java token


【解决方案1】:

我认为您的scan.hasNext.equals("x") 不正确。如果您将其替换为scan.next().equals("x="),情况可能会有所改善。此外,您正在扫描两次。如果您的第一次扫描失败,您的下一个 if 语句将使您再向前扫描一行。

以下方法可行:

import java.util.Scanner;

public class x {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int exes = 0;
    int whys = 0;
    while (scan.hasNext())
    {
      String line = scan.next();
      if (line.equals("x="))
        exes+=scan.nextInt();
      else
        whys+=scan.nextInt();
    }
    System.out.println("X: " + exes);
    System.out.println("Y: " + whys);
  }
}

【讨论】:

    【解决方案2】:

    你的想法是对的,但是你有一些语法和逻辑错误。我不想为你完全解决这个问题,但这里有一些注意事项

    1. 级联方法调用在每个方法后仍需要括号。它应该是scan.hasNext().equals("x"),而不是`scan.hasNext.equals("x")

    2. 使用级联调用时,请考虑每个方法后返回的数据类型。 hasNext() 返回什么数据类型?询问该数据类型是否等于给定字符串是否有意义?

    3. 请记住,hasNext() 不会使用文件中的任何数据。您应该只使用它来查看是否有要读取的数据,但如果有,则必须使用 next() 或其某种变体来实际获取数据。同样,注意从文件中读取太多次(例如使用 2 个不同的next() 调用来读取一个变量)。

    4. equals("x") 正在寻找精确匹配。还有其他字符串方法可用于查看字符串是否以字符序列开头,或者您应该使用您期望匹配的确切模式(即“x =”)。

    这些练习的目的是帮助您像程序员一样思考。即使有人给了你工作代码,在使用之前确保你理解每一行的细节。

    【讨论】:

    • 感谢 crand6 的解释
    【解决方案3】:

    试试这个

     import java.io.BufferedReader;
     import java.io.FileReader;
     import java.io.IOException;
     public class Read {
     public static void main(String[] args) throws IOException {
        FileReader file=new FileReader("D:\\Test.txt");
        BufferedReader br=new BufferedReader(file);
        String str;
        int xSum=0;
        int ySum=0;
        while((str=br.readLine())!=null)
        {
            if(str.contains("x=")){
                xSum+=Integer.parseInt(str.split("=")[1].trim());
            }if(str.contains("y=")){
                ySum+=Integer.parseInt(str.split("=")[1].trim());
            }
        }
        System.out.println("Sum x is: "+xSum+" Sum y is: "+ySum);
    }
    }
    

    【讨论】:

    • 我认为你不需要使用BufferedReader。 OP 正在使用Scanner,那么您可以将您的代码用于while(Scanner#hasNextLine()),将逐行读取文件并应用相同的逻辑。
    • 是的。你想要的任何东西都可以使用:)
    猜你喜欢
    • 2022-08-19
    • 2020-07-29
    • 2022-11-13
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多