如何使用close()或reset()从头读取扫描器



我有一个3x3矩阵输入流,我在这里计算两个主要对角线上的和的绝对差。在下面的例子:

11 2 4

4 5 6

8 -12

应该给我一个15的结果,因为:

| 11 + 5 - 12 | - | 4 + 5 + 10 |

= | 4 | - | 19 |

= 15

我的代码如下:

public class Solution {
static int diagSumL(int lines, Scanner in) {
    int currSum;
    currSum = 0;
    for (int i = 0; i < lines; i++) {
        for (int j = 0; j < i; j++) {
            in.nextInt();
        }
        currSum += in.nextInt();
        System.out.println(currSum);
        if (in.hasNextLine() == true) {
            in.nextLine();
        }
    }
    return currSum;
}
static int diagSumR(int lines, Scanner in) {
    int currSum, index;
    currSum = 0;
    for (int i = lines; i > 0; i--) {
        for (int j = 1; j < i; j--) {
            in.nextInt();
        }
        currSum += in.nextInt();
        System.out.println(currSum);
        if (in.hasNextLine() == true) {
            in.nextLine();
        };
    }
    return currSum;
}
static int absDiff(int a, int b) {
    return Math.abs(a) + Math.abs(b);
}
public static void main(String[] args) {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
    Scanner in = new Scanner(System.in);
    int lines, sumDiagL, sumDiagR;
    lines = in.nextInt();
    sumDiagL = diagSumL(lines, in);
    in.close();
    in = new Scanner(System.in);
    sumDiagR = diagSumR(lines, in);
    int result = absDiff(sumDiagL, sumDiagR);
    System.out.println(result);
}

}

我的代码错误在第3到最后一行,根源于我的diagSumR方法试图调用in.intNext(),错误是:

线程"main"java.util.NoSuchElementException

我想做的是重置扫描器,这样我就可以重新开始并从头重新读取扫描器(这样我就可以计算其他对角线的和)。我是不是用错了close() ?(每个在线使用close()的例子都是这样的)

也可以使用来自Scanner类的reset()作为替代方案,如果是的话,如何使用?

为什么它不工作

这不起作用,因为当您使用close()关闭扫描仪时,它不仅"关闭"对象,还"关闭"底层的System.in。因此,即使当您创建一个新的Scanner实例时,底层的System.in将被关闭,因此您将获得异常。这可以在调用close()之前和之后使用System.in.available();进行检查。此外,在流被关闭后,不可能重新打开流。

请遵循文档。

如果它的底层可读也实现了Closeable接口,那么可读的close方法将被调用

另一方面,

System.in返回一个实现Closeable, AutoCloseable的InputStream。

2。应该怎么做。

即使你不想把你的矩阵存储在内存中,你的解决方案也会是次优的,因为它需要用户输入矩阵两次,因为一旦从System.in读取了一些东西,你就不能用Scanner重新读取它!这里有所有的数据所以你可以一次计算两个和存储两个和变量因为你要读入所有的数字。只要注意哪个数字被加到哪个sum变量上。

3。如何做到这一点。

既然你要传递Scanner实例,我看不出有任何理由在调用diagSumR之前将其close()并重新初始化,只需在方法结束时关闭它。如前所述,缺点是您需要再次手工输入矩阵。

不确定,问题是否理解扫描器(你试图向后移动,那也是之后)

如果不是,可以更简单地解决(假设是方阵)

for (int i = 0; i < N; i++) {
    diagonal1 += A[i][i]; // 0,0 + 1,1 + 2,2 + ... + n,n
    diagonal2 += A[N-1-i][i]; // n,0 + n-1, 1, .. + 2,2 + 1, n-1 + 0,n
}

其中N为矩阵A (&我希望很清楚,N-1的使用是用于索引从0到N-1)

最新更新