提问人:Jock 提问时间:5/22/2023 最后编辑:f1shJock 更新时间:5/23/2023 访问量:57
为什么我的扫描仪需要很长时间才能将输入转换为 2D 字符数组?
Why is my Scanner taking too long to convert inputs to a 2D char array?
问:
扫描仪到 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 的时间复杂度,但我觉得这仍然不应该让它花这么长时间。
答:
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我修改了我的答案。我太专注于您的控制台输入。如果可以编辑文件,只需将行数作为第一行即可。然后,可以从文件中获取所有输入。
评论