为什么我的扫描仪需要很长时间才能将输入转换为 2D 字符数组?

Why is my Scanner taking too long to convert inputs to a 2D char array?

提问人:Jock 提问时间:5/22/2023 最后编辑:f1shJock 更新时间:5/23/2023 访问量:57

问:

扫描仪到 2D 字符阵列花费的时间太长。

你好!出于某种原因,我不了解我的代码需要很长时间,我唯一的猜测是扫描仪很慢,但我无法逃避它,因为我需要使用它。seaCard 的大小可以从 1 * 1 到 10000 * 10000 不等。cpu 时间限制为 8 秒,这应该有足够的时间来执行此操作。整个任务是计算网格中的岛屿,但我什至无法及时读取数据。

输入是这样的地图

~~~~~
~@@~~
@~~~~.

我的代码是这样的。

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int rows = input.nextInt();
        int cols = input.nextInt();
        input.nextLine();
        
        char[][] seaCard = new char[rows][cols];

        // making the map
        for(int i = 0; i < rows; i++){
            String thisRow = input.nextLine();
            for(int j = 0; j < cols; j++){
                seaCard[i][j] = thisRow.charAt(j);
            }
        }
        input.close();

我尝试从 2D 数组更改为 1D 字符串数组,但这并没有太大变化,我还尝试使用 next() 而不是 nextLine()。

我希望代码运行平稳,并且对于行 = 10000 和 cols = 10000 的字符串输入,字符串输入为 10000 行长度为 10000 的字符串,代码运行时间不会超过 6 秒。

然而,它只是完成,我唯一的想法是,因为我使用 2 个循环,我得到了 n^2 的时间复杂度,但我觉得这仍然不应该让它花这么长时间。

Java 数组 网格 java.util.scanner 变量赋值

评论

0赞 Jock 5/22/2023
我刚刚注意到文本和输入的某些部分进入了代码区域,我很抱歉我已经很久没有^^这样做了。
2赞 WJS 5/22/2023
你为什么不在关键位置撒一些打印声明,看看发生了什么?
1赞 f1sh 5/22/2023
它适用于较小的尺寸吗?
0赞 Jock 5/22/2023
我刚刚做了,我可以看到它正在做我想要的事情,但它非常慢。我错过了什么吗?
1赞 g00se 5/22/2023
你必须是一个快速的打字员。不知道我需要多少小时才能输入 10,000 行文本......

答:

0赞 WJS 5/22/2023 #1

此版本从文件中获取输入。第一行应该是行数。无需从控制台输入任何内容。

public static void main(String[] args) {
    try (Scanner fromFile = new Scanner(new File("C:/yourFilename.txt"))) {
        int rows = fromFile.nextInt(); // read the rows from the file.
        fromFile.nextLine();  // remove EOL from the input buffer
        char[][] seaCard = new char[rows][];
        for (int r = 0; r < rows; r++) {
            seaCard[r] = fromFile.nextLine().toCharArray();
        }
        System.out.println("Done!");
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

评论

0赞 WJS 5/22/2023
您无需输入列。只需输入行数,然后键入任意长度的每个输入字符串。它将相应地调整列。这就是所谓的不规则数组,其中每行可以具有不同数量的列。
0赞 WJS 5/22/2023
你在说什么“卡”?您的代码指示您正在从控制台获取输入。
0赞 Jock 5/23/2023
效果很好,非常感谢。我确实相信很多问题都在我的电脑上,但从文件中读取会创造奇迹!
0赞 WJS 5/23/2023
@Jock我修改了我的答案。我太专注于您的控制台输入。如果可以编辑文件,只需将行数作为第一行即可。然后,可以从文件中获取所有输入。