【问题标题】:Formatting of 2D arrays of chars二维字符数组的格式化
【发布时间】:2017-03-14 02:40:41
【问题描述】:

我有一个程序,它从文件中读取一对整数并将其存储在我创建的 Point 类中。第一个整数是 x 坐标,第二个是文件每一行的 y 坐标。所有有效点的 x 坐标在 [0, 40] 范围内,y 坐标在 [1, 20] 范围内。

输入文件包含如下数据:

我执行了一些验证检查,以便我的程序忽略无效数据或超出范围的数据。

然后我必须在这些点之上绘制一条回归线。 我必须使用 2D 字符数组,并且更愿意以这种方式使用 Java 的 Point2D 类或其他一些 Java 图形类。

“X”表示点,“-”表示回归线段,“”表示线段和点位于同一点*

用于回归线的公式是这样的:

#编辑#

下面是我从@sprinter 得到的代码sn-p:

initializeArray(charArray);
  int xySum = 0;
  int xSqSum = 0;
  int xSum = 0;
  int ySum = 0;
  for (Point points: point) {
    xySum += points.getX() * points.getY();
    xSqSum += points.getX() * points.getX();
    xSum += points.getX();
    ySum += points.getY();
  }
  int xMean = xSum / count;
  int yMean = ySum / count;
  int n = point.size();
  int slope = (xySum - n* xMean * yMean) / (xSqSum - n * xMean * xMean);

    for (Point points: point) {
      charArray[points.getX()][points.getY()] = 'X';
    }
     // plot the regression line
    for (int x = 0; x <charArray.length; x++) {
      int y = yMean + slope * (x - xMean); // calculate regression value
        charArray[x][y] = charArray[x][y] == 'X' ? '*' : '-';
    }

这是我运行 sprinter's 代码后程序的输出。:

而我想要这样的输出:

这也是我初始化 charArray 的方式:

public static void initializeArray(char[][] charArray) {
  for(int k =0; k< charArray.length; k++) {
      for(int d = 0; d<charArray[k].length;d++) {
        charArray[k][d] = ' ';
      }
    }
}

这是新的输出:

【问题讨论】:

  • 这是一个很大的问题,但描述很小,图片占用了很多空间。我很高兴再次提供更多信息。
  • 你打印出你得到的斜坡和 yPred 了吗?
  • 是的,我为斜率和 yPred 值做了值。 @RAZ_Muh_Taz

标签: java arrays multidimensional-array formatting char


【解决方案1】:

我发现很难理解 fillArray 函数应该做什么。对于点列表中的每个“x”值,您可以有多个“y”值,所以我假设您为每个点调用一次。但是回归线有很多不在点列表中的“x”值,这意味着您必须为每个回归点调用一次。填完值后也不需要返回数组。

您的斜率计算似乎与公式完全不符。这对我来说更有意义:

float xySum = 0;
float xSqSum = 0;
float xSum = 0;
float ySum = 0;
for (Point point: points) {
    xySum += point.x * point.y;
    xSqSum += point.x * point.x;
    xSum += point.x;
    ySum += point.y;
}
float xMean = xSum / count;
float yMean = ySum / count;
float n = points.size();
float slope = (xySum - n* xMean * yMean) / (xSqSum - n * xMean * xMean);

我怀疑绘制所有点然后绘制回归线会更好。

List<Point> points = ...;
// first plot the points
for (Point point: points) {
    array[point.x][point.y] = 'X';
}
// now plot the regression line
for (int x = 0; x < 40; x++) {
    int y = Math.round(yMean + slope * (x - xMean));
    array[x][y] = array[x][y] == 'X' ? '*' : '-';
}

顺便说一句,如果您熟悉 Java 8 流,那么您可以使用:

double n = points.size();
double xySum = points.stream().mapToDouble(p -> p.x * p.y).sum();
double xSqSum = points.stream().mapToDouble(p -> p.x * p.x).sum();
double xMean = points.stream().mapToDouble(p -> p.x).sum() / n;
double yMean = points.stream().mapToDouble(p -> p.y).sum() / n;

最后,您的 x 维度是第一个,y 维度是第二个。因此,要打印,您需要先遍历 y,而不是 x:

for (int y = 0; y < 20; y++) {
    for (int x = 0; x < 40; x++) {
        System.out.print(array[x][20-y-1]);
    }
    System.out.println();
}

【讨论】:

  • 但是我必须在点的顶部绘制回归线,用你的方法可以吗?
  • 我刚刚将您的代码复制到我的程序中,但输出仍然存在一些问题。如果你想让我放照片,请告诉我。 “-”字符仍然像上面发布的第一张图片。它们在同一位置相互堆叠。输出中也没有显示“*”。 @sprinter
  • 我刚刚更新了问题,并且还添加了您提供给我的代码的输出。我还发布了 initializeArray 方法,我认为这可能是问题的根源,因为我在朋友的建议下使用 ' ' 空格字符初始化了数组。即使它从一开始就在我的程序中,它也没有在这里发布过。抱歉,我不得不删除我的其他输出,因为问题变得越来越混乱。我希望你能帮助我。 @sprinter
  • 您的打印看起来像是在交换 x 和 y。回归线平坦的原因是四舍五入到整数。我会换成花车。
  • 我刚刚将 int 更改为 float,现在它在这条线上给了我精度错误`charArray[x][y] = charArray[x][y] == 'X' ? '*' : '-';
猜你喜欢
  • 1970-01-01
  • 2021-04-07
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2023-03-11
  • 1970-01-01
  • 2016-11-12
相关资源
最近更新 更多