什么等同于整数的 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
基本上不知道空行。
如果您调用 nextInt
,Scanner
会做两件事:
- 查找下一个标记(默认:由 any 空格分隔)。
- 尝试将其转换为
int
。
标记化行为是 Scanner
的一个重要特征。如果您输入 1 2\n
并调用 nextInt
两次,您将得到 1
和 2
。但是,如果您输入一个空行,标记化 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
可能会使它的行为更接近人们对阅读控制台的期望,只是逐行。
下面是我现在的脚本
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
基本上不知道空行。
如果您调用 nextInt
,Scanner
会做两件事:
- 查找下一个标记(默认:由 any 空格分隔)。
- 尝试将其转换为
int
。
标记化行为是 Scanner
的一个重要特征。如果您输入 1 2\n
并调用 nextInt
两次,您将得到 1
和 2
。但是,如果您输入一个空行,标记化 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
可能会使它的行为更接近人们对阅读控制台的期望,只是逐行。