如何在没有过多运行时间的情况下打印出1000 x 1000的点网格?

时间:2019-04-30 17:46:19

标签: java

int[][] graph = new int[1000][1000];

for (int i = 0; i < graph.length; i++) {
    for (int j = 0; j < graph.length; j++) {
        System.out.print(new Point(i, j));
    }

    System.out.println();
}

public class Point {
    private final double x;
    private final double y;
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
    @Override
    public String toString() {
        return ("(" + x + ", " + y + ")");

我可以获取代码以打印出1000 x 1000的网格点,但是我希望程序可以在不浪费运行时间的情况下打印出网格。

2 个答案:

答案 0 :(得分:0)

如以上评论中的John Bollinger所述,“ I / O是您可以要求计算机执行的最慢的操作之一。”

因为您的目标是将网格打印到控制台,所以我建议构建一个包含网格的String,然后进行打印(而不是顺序打印每个元素)。

您更新的代码如下所示:

int[][] graph = new int[1_000][1_000];

StringBuilder sb = new StringBuilder(1_000_000);

for (int i = 0; i < graph.length; i++) {
    for (int j = 0; j < graph.length; j++) {
        sb.append(new Point(i, j));
    }

    sb.append('\n');
}

System.out.println(sb);

如果没有适当地进行基准测试,它平均仍需不到400毫秒才能完成,而您的旧代码在不到4秒的时间内就为我完成了。

答案 1 :(得分:0)

我认为代码中还有另一个问题:
在第二个for循环中,您将访问图的第一列的长度。这将导致如果您使用具有不同大小的列和行的代码,则输出仍将具有相同大小的行和列。可以通过在第二个for循环中访问graph[i].length来解决此问题。