什么等同于整数的 isEmpty()?

what is equivalent to isEmpty() for integers?

下面是我现在的脚本

import java.util.Arrays;
import java.util.Scanner;

public class SeeWhatTo 
{   
     public static void main(String args[]) {
       Scanner scan = new Scanner(System.in); //define scan  
       int a = scan.nextInt();
       int sum =0;
           while (a>0 )
     {                   
            sum = sum +a;
            a = scan.nextInt();    
     }
        System.out.println(sum);   //print out the sum
    }    
}

目前,它在 a 中存储一个输入值,然后将其添加到 sum 中,一旦输入负数或零,它就会暂停并输出总和。

我想知道是否有一个等价于 isEmpty 的整数,这样我就可以做到 while (! a.isEmpty() ) 所以当没有输入但输入时,它会停止并打印出总和。

一个自然的后续行动是,有没有办法将输入整数分配给 a 并在 while 条件下同时检查它是否为空,如 while ( ! (a=scan.nextInt()).isEmpty() )

在您描述的意义上没有等价物,因为 String 是一个可变长度的字符集合,并且具有零个字符仍然是有效的 String。一个整数不能包含零个整数,因为根据定义,它已经是一个整数。

但是,您的问题围绕着 Scanner 的工作方式,而不是 int 的工作方式。

看看 scan.hasNextInt(),如果有 int 可以读取,returns 为 true,否则为 false。这可能会给你你想要的,使用类似的东西:

Scanner scan = new Scanner(System.in);
int sum = 0;
while(scan.hasNextInt())
{
    int a = scan.nextInt();
    sum = sum + a;
}
System.out.println(sum);

Scanner 可以做两件事:

  • 逐行阅读 (nextLine)。
  • 逐个读取令牌(next 或例如 nextInt)。

这实际上是 Scanner 的两个不同功能,如果您正在读取标记,那么您的 Scanner 基本上不知道空行。

如果您调用 nextIntScanner 会做两件事:

  • 查找下一个标记(默认:由 any 空格分隔)。
  • 尝试将其转换为 int

标记化行为是 Scanner 的一个重要特征。如果您输入 1 2\n 并调用 nextInt 两次,您将得到 12。但是,如果您输入一个空行,标记化 Scanner 只是将其作为空格跳过并继续寻找另一个标记。

所以直截了当的答案是 "no":你永远无法通过调用 nextInt 获得 "empty" int 并且仍然保留令牌 -按令牌的行为。 (这超出了 Java 中的原始变量不能是 "empty" 的事实。)

一个简单的方法来完成你所要求的是使用逐行阅读,然后自己调用 parseInt

Scanner systemIn = new Scanner(System.in);
int sum = 0;

String line;
while (!(line = systemIn.nextLine()).isEmpty()) {
    sum += Integer.parseInt(line);
}

但是你失去了分词行为。现在,如果您输入 1 2\n,则会抛出异常,因为 nextLine 会找到 1 2.

您仍然可以使用 nextInt 逐个标记地读取,但更复杂,使用第二个 Scanner:

Scanner systemIn = new Scanner(System.in);
int sum = 0;

String nextLine;
while (!(nextLine = systemIn.nextLine()).isEmpty()) {
    Scanner theInts = new Scanner(nextLine);

    while (theInts.hasNextInt()) {
        sum += theInts.nextInt();
    }
}

在这里,我们可以输入 1 2\n,得到 1 2 作为我们的下一行,然后让第二个 Scanner 来标记它。

所以是的,您可以编写您正在寻找的功能,但不是简单的方法,因为 Scanner 更复杂。

编辑

可能另一种方法是在行分隔符上使用定界符:

// use System.getProperty("line.separator") in 1.6
Scanner systemIn = new Scanner(System.in).useDelimiter(System.lineSeparator());
int sum = 0;

while (systemIn.hasNextInt()) {
    sum += systemIn.nextInt();
}

现在,nextInt 的分词方式与 nextLine 相同。这将打破任何不是 int 的输入的循环,包括空标记。 (默认分隔符不可能有空标记。)我从来不确定人们是否真的期望 Scanner 的默认分隔符按照它的方式工作。以这种方式创建一个 Scanner 可能会使它的行为更接近人们对阅读控制台的期望,只是逐行。