gpt4 book ai didi

另一种方法中的 Java 扫描器

转载 作者:搜寻专家 更新时间:2023-11-01 03:48:41 27 4
gpt4 key购买 nike

我正在为我的一门类(class)做一个实验室,因此我更多地是在寻找解释而不是实际代码。

对于此作业的一部分,我需要从用户那里读取数字,直到按下 control-d。我在一个方法中有一个 while 循环,我也将扫描仪传递给该方法,这是我的主要方法:

    Scanner scan = new Scanner(System.in);

System.out.println("Length:");
int length = 0;

if(scan.hasNextInt()){
length = scan.nextInt();
}

if(length<0 || length>100){
System.out.println("Length is not of the proper size");
scan.close();
return;
}

Double[] a1 = new Double[length];
Double[] a2 = new Double[length];
fillWithZeros(a1);
fillWithZeros(a2);

System.out.println("Enter the numbers to be multiplied:");

a1 = fillWithValues(a1,scan);
a2 = fillWithValues(a2,scan);
double total = calculateTotal(a1,a2);
printVector(a1,"a1");
printVector(a2,"a2");
System.out.println("Total: " + total);
scan.close();

然后这是我的 fillWithValues 方法:

public static Double[] fillWithValues(Double[] array, Scanner scan) {
int numberOfElements = 0;
while(scan.hasNextDouble()){
if(numberOfElements<array.length){
array[numberOfElements] = scan.nextDouble();
numberOfElements++;
}else{
return array;
}
}
return array;
}

我遇到的问题是,当我按下 Control-D 时,它并没有像它应该的那样结束输入流,但是我在 main 中有上面的代码,它会结束输入流,所以有人可以解释为什么我有这个问题吗?

我只是将扫描仪声明为全局变量,但我不允许将全局变量用于此赋值。

最佳答案

在上面的代码中,您正在使用

a1 = fillWithValues(a1,scan);
a2 = fillWithValues(a2,scan);

fillWithValues() 本质上是这样做的

while(scan.hasNextDouble()){
...
}

这意味着,如果扫描器观察到 EOF 字符(在 Unix 中为 CTRL-D),scan.hasNextDouble() 将返回 false 并且该方法将终止 - 但是,您的程序会立即再次调用该方法,扫描器将等待下一个 double 值(如果您再次按 CTRL-D,在这种情况下程序最终也应该终止).

如果您将两个方法调用替换为循环的一个调用,则程序将在(仅第一个)循环之后恢复并终止。

为了解决这个问题,您可以让该方法返回一个 boolean 而不是数组(您不需要返回并将数组重新分配为返回值,因为您已经在修改数组元素您作为参数传递的数组):

public static boolean fillWithValues(Double[] array, Scanner scan) {
int numberOfElements = 0;
while(scan.hasNextDouble()){
if(numberOfElements<array.length){
array[numberOfElements] = scan.nextDouble();
numberOfElements++;
}else{
return true; // all elements read
}
}
return false; // input aborted
}

然后调用代码可以决定是终止还是继续:

if (fillWithValues(a1,scan) == true) {
fillWithValues(a2,scan); // could also check the return value again if required
}

顺便说一句,只有在绝对需要时才使用 static 方法——这里没有必要。一旦您的整体逻辑工作正常,您应该将其作为删除 static 方法的练习。

关于另一种方法中的 Java 扫描器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34980765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com