4

我正在自学 Java,遇到了一个我想解决的问题。这是问题所在:

编写一个以Calculator方法命名的类int sum(String s)。字符串s包含一组由空格(空格、制表符或换行符)分隔的整数。返回整数的总和。

你可以使用一个Scanner对象来解决这个问题。创建 anew Scanner(s)并将其存储在变量中,例如in。然后,用于in.hasNextInt()控制一个while循环。while 循环的每次迭代都用于in.nextInt()从 String 获取下一个整数s。将此整数累积到一个变量中,并在循环退出时返回该变量。

您可以使用 main 方法来测试您的方法,方法是创建Calculator类的一个实例并使用该实例调用sum(…)多个值组合。


到目前为止我的代码是

import java.util.Scanner;

public class calculator{
    public int sum(String s){
        new Scanner(s);
        String in = s;
        while (s.hasNextInt()) {
            s = in.nextInt();
        }
        return(0);
    }
}

我还没有完成课程,但我收到一个错误提示

找不到符号:方法 hasNextInt()

为什么?从现在开始,我不太确定该怎么做,那我该怎么办?是否s已正确存放in

4

10 回答 10

58

你的变量声明,

new Scanner(s);
String in = s;

大错特错。您必须将扫描仪存储在变量中。这意味着:

Scanner myScanner = new Scanner(s);

然后

while (myScanner.hasNextInt())
于 2013-09-10T13:17:27.843 回答
17

如果您不将其存储在某处,那么仅创建 anew Scanner(s)不会有太大作用。该分配似乎要求您将(而不是s)存储在一个名为 的变量中in

Scanner in = new Scanner(s);

之后,您不必s再直接处理:Scanner可以为您完成工作。

在您的代码中,s是 a String,因此它没有像hasNextInt()and之类的方法nextInt()。你应该调用那些in应该是 a 的Scanner(这是错误的直接原因)。

于 2013-09-10T13:17:10.690 回答
5

您正在调用String.

您需要调用该hasNextInt()方法Scanner

Scanner sc = new Scanner(s);
while (sc.hasNextInt()) {
   int i = sc.nextInt();
}
于 2013-09-10T13:18:25.120 回答
4

您需要在Scanner对象而不是 String 对象上调用hasNextInt()方法。s

    Scanner sc = new Scanner(s);
    int i = 0;
    while (sc.hasNextInt()) {

       i = sc.nextInt();

     }
于 2013-09-10T13:17:03.937 回答
4

创建一个新的扫描仪不会做任何事情。您需要将其存储在 Scanner 类的某个对象中:

Scanner input = new Scanner(s);

之后,扫描仪将为您完成工作。

此外,String 没有 hasNextInt() 和 nextInt() 之类的方法。您需要使用 Scanner 对象访问这些方法,最后您需要关闭 Scanner:

import java.util.*;

public class Abc{

  public static void main(String[] args) {

     String s = "Hello, World!";
     Scanner scanner = new Scanner(s);

     while (scanner.hasNext()) {
         System.out.println("" + scanner.hasNextInt());
     }
     scanner.close();
  }
}

要读取输入,您还可以使用 BufferedReader。

于 2013-09-10T13:37:04.570 回答
3

您正在尝试hasNextInt()在您的 String Object 's' 上使用该方法。

字符串对象没有这样的方法。因此错误是正确的。

我假设你想使用 Scanner,所以你应该创建一个新的 Scanner 对象:

Scanner scanner = new Scanner(s);

您需要将扫描仪对象存储在变量中 - 否则您将丢失扫描仪对象并且无法使用它。这就像建造一个很酷的小工具,但忘记了你把它放在家里的什么地方。

然后你可以使用方法

scanner.hasNextInt()

这是扫描仪的一部分,可以做你想做的事。循环使用它现在应该会更好。

于 2013-09-10T13:18:46.357 回答
1

您错误地使用了扫描仪。在此处访问扫描仪的 Javadoc 。它提供了一些示例

这是您的代码的更新

Scanner scanner = new Scanner(s);
while (scanner.hasNextInt()) {
   int i = sc.nextInt();
}
于 2013-09-10T13:19:54.863 回答
0

第 1 点。

编写new Scanner(s);将执行 Scanner 构造函数并创建一个对象。

但是不将它分配给任何相同类型的变量最终会导致该对象在内存中无法触及。任何您以后将无法参考/使用它。

现在第 2 点,

由于 objects是 typeString并且 String 类没有定义,hasNextInt()因此您最终会遇到错误cannot find symbol : method

第 3 点,

hasNextInt()是类的属性Scanner。因此,如果您创建一个类对象Scanner并正确关联相同类型的变量,您可以立即使用它。例如,

Scanner scnr = new Scanner(s);
if(scnr.hasNextInt())
..
....
于 2013-09-11T05:56:38.427 回答
0

您必须将Scanner对象存储在某个变量中,然后hasNextInt像这样使用:

import java.util.Scanner;
public class calculator{
  public int sum(String s){
    Scanner myScanner = new Scanner(s);
    int total = 0;
    while (myScanner.hasNextInt()) {
      total += myScanner.nextInt();
    }
    return(total);
  }
}
于 2013-09-10T13:20:36.733 回答
-3
import java.util.*;

public class Calculator {

    public static void main(String[] args) 
    {
        String s = "";

        // create a new scanner with the specified String Object
        Scanner scanner = new Scanner(s);

        // call the method
        while (scanner.hasNext()) 
        {
            // check if the scanner's next token is an int
            System.out.println("" + scanner.hasNextInt());

            // print what is scanned
            System.out.println("" + scanner.next());
        }

        // close the scanner
        scanner.close();
    }
}
于 2013-09-10T13:25:14.513 回答