【问题标题】:Java - iterate through 3 variables of differing array lengthsJava - 遍历 3 个不同数组长度的变量
【发布时间】:2014-10-07 16:00:10
【问题描述】:

我正在尝试遍历以下伪代码设置,但我似乎只能使用 for 循环和区分大小写。有没有简单的方法来解决这些问题?

编辑:更清楚地说,我有两个二维双坐标数组,因此我有 PunkteX[i][m] 和 PunkteY[i][m]。这两个数组的长度总是相同的,但整数 i 和 m 是可变的。我想遍历它们,以便将它们组合成一个新的 Point2D[p] 类型的二维数组。 Point2D 数组的长度将由 i 和 m 决定。

int i = punkteX.length; // same as punkteY.length;
int m = punkteX[0].length;  // same as punkteY[0].length;
Point2D[] array = new Point2D[i*m];

array[0] = (punkteX[0][m], punkteY[0][m]);
array[1] = (punkteX[1][m], punkteY[1][m]);    
array[2] = (punkteX[2][m], punkteY[2][m]);
.
.
array[i-1] = (punkteX[i-1][m], punkteY[i-1][m]);
array[i]   = (punkteX[i][m], punkteY[i][m]);
array[i+1] = (punkteX[0][m-1], punkteY[0][m-1]);
array[i+2] = (punkteX[1][m-1], punkteY[1][m-1]);
array[i+3] = (punkteX[2][m-1], punkteY[2][m-1]);
.
.
array[p-1] = (punkteX[i-1][0], punkteY[i-1][0]);
array[p] = (punkteX[i][0], punkteY[i][0]);

为了完整起见,我的尝试似乎只适用于 i = 3,如下所示:

    for (int p = 0; p < array.length; ++p) {
        for (int m = 0; m < mtimes; ++m) { // mtimes = column length of PointX and PointY Arrays
        Point2D[] interimarray = new Point2D[n]; // Global var n = i
        for (int i = 0; i < interimarray.length; ++i) {
            p = (p+i); 
            if (i == (interimarray.length-1)) { p -= 1; }
            if (p < (array.length)) {
                array[p] = new Point2D(xArray[i][(mtimes-m-1)], yArray[i][(mtimes-m-1)]);}
            if ((p!= 0) && (i==(n-1))) { p += 1; }}}}

【问题讨论】:

  • 你最好在这个伪代码中解释你想要实现的目标 - 你想要做什么并不明显。
  • 是的,这很令人困惑。我不知道你想在这里做什么。您是否有一个数据结构并且您正在尝试浏览它?或者您是否正在尝试创建一个数据结构并在其中导航?
  • 还应该补充一下,它有被关闭的风险,因为它是多么的不清楚。
  • 所以你想生成行列数可变的二维数组之类的?
  • 我已经添加了一些规范,现在这个问题更有意义了吗?

标签: java loops iteration


【解决方案1】:

这对我来说仍然很困惑,但这会生成您正在寻找的配置。 p 索引总是随着 i 数组的每次迭代而增加,因此您可以在该循环中执行 p++ 。除此之外,它只是一个嵌套的 for 循环。

int p = 0;
for(int m = mArray.length - 1; m >= 0; m--) {
    for(int i = 0; i < iArray.length; i++) {
        System.out.println("p = " + p + ", i = " + i + ", m = " + m);
        p++;
    }
}

如果您正在为如何存储新数据结构而苦恼,您可能想要使用包装类。包装类将保存来自 punkteX 和 punkteY 的双坐标数组。此代码将获取您的两个数组,遍历它们,并将它们存储在 point2DArray 中,它的类型是 Point2D,我们的包装类。我还包含了一个示例包装类,以便您了解数据是如何存储的。

int mArrayLength = punkteX[0].length;
int iArrayLength = punkteX.length;
Point2D[] point2DArray = new Point2D[mArrayLength];
int p = 0;
for(int m = 0; m < mArrayLength; m++) {
    for(int i = 0; i < iArrayLength; i++) {
        point2DArray[p] = new Point2D(punkteX[i][m], punkteY[i][m]);
        p++;
    }
}

public class Point2D {
    private double[] punkteX;
    private double[] punkteY;

    public Point2D(double[] punkteX, double[] punkteY) {
        this.punkteX = punkteX;
        this.punkteY = punkteY;
    }

    public double[] getPunkteX() {
        return punkteX;
    }

    public double[] getPunkteY() {
        return punkteY;
    }
}

如果你想得到一个特定的 punkteX 和 punkteY(比如当 p = 0 时),你可以在你的新数据结构上使用它:

double[] punkteXValue = point2DArray[0].getPunkteX();
double[] punkteYValue = point2DArray[0].getPunkteY();

另外:不要在 Java 中的变量名前面使用大写字母,这会使它们看起来像类名。良好的代码约定将使人们更有可能为您提供帮助,因为它更易于阅读。

【讨论】:

  • 感谢您提供一个工作示例,尤其是额外的输入!我仍然需要查看并可能以某种方式整合所有想法,但这非常有帮助。
【解决方案2】:

这就是我的解决方案:

public class Test {

    private final static int P = 20;
    private final static int M = 4;

    public static void main(String[] args) {

        int m = 5;
        int i = 0;

        for (int p=0; p < P; p++)
        {
            if (p % M == 0)
            {
                m--;
                i = 0;
            }
            System.out.println ("p = " + p +" i = " + i  +" m = " + m );
            i++;

        }
    }

}

【讨论】:

    【解决方案3】:

    这个怎么样

    int m = mtimes;
    int p = 0;
    while (m >= 0) {
        int itimes = ...; //row length;
        for (int i = 0; i < itimes; i++) {
            // 
            p++;
        }
    
        m--;
    }   
    

    【讨论】:

      猜你喜欢
      • 2016-02-23
      • 2016-07-23
      • 2011-01-20
      • 2015-02-21
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多