2014-10-07 2 views
-1

Я пытаюсь выполнить итерацию с помощью следующего псевдокода, и я, похоже, застрял в использовании только для циклов и разностей случаев. Есть ли простой способ пройти через них?Java - итерация через 3 переменные с различной длиной массива

Редактировать: Чтобы быть более ясным, у меня есть два двумерных двойных массива координат, заданных так, что у меня есть PunkteX [i] [m] и PunkteY [i] [m]. Эти два массива всегда будут иметь одинаковую длину, но целые числа i и m являются переменными. Я хотел бы пропустить их, чтобы объединить их в новый 2-мерный массив типа 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]); 

Моя попытка, для полноты картины, которая, кажется, работать только при г = 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; }}}} 
+0

Лучше объясните, чего вы пытаетесь достичь в этом псевдокоде - не очевидно, что вы пытаетесь сделать. –

+0

Да, это очень смущает. Я понятия не имею, что вы здесь делаете. У вас есть структура данных, и вы пытаетесь перемещаться по ней? Или вы пытаетесь создать структуру данных и перемещаться по ней? – sage88

+0

Также следует добавить, что это может быть закрыто из-за того, насколько он неясен. –

ответ

1

Это все еще очень ко nfusing для меня, но это создаст конфигурацию, которую вы ищете. Индекс p всегда увеличивается с каждой итерацией через массив i, поэтому вы можете просто выполнить p ++ в этом цикле. Кроме этого, это всего лишь вложенный цикл.

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 (скажем, при р = 0), вы будете использовать это на новую структуру данных:

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

Помимо: Не используйте кепки в начале имен переменных в Java, это делает их похожими на имена классов. Хорошие условные обозначения кода заставят людей гораздо больше помочь вам, так как их будет легче читать.

+0

Благодарим вас за предоставленный рабочий пример и особенно за дополнительный ввод!Мне все равно придется взглянуть и, возможно, каким-то образом включить все идеи, но это очень полезно. – Denor

0

Это мое решение:

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++; 

     } 
    } 

} 
0

Как об этом

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

    m--; 
} 
Смежные вопросы