有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数组行中数字的移动

当我有一行数字[1,2,3,4,5]时,我很难想象会发生什么,我要么想把这些数字移到行的前面,要么移到行的后面

基本上,在这里,我将通过我的行,从后到前,并添加每个数字。但与此同时,将索引向右移动一行

代码片段:

void addCoordinateRowFront(CoordinateRow rowOfCoordinates) {

        for(int j = rowOfCoordinates.numberOfElements; j > 0; j--) {

            for(int i = numberOfElements; i > 0; i--) {

                newCoordinateArray[i] = newCoordinateArray[i-1];

            }
            newCoordinateArray[0] = rowOfCoordinates.newCoordinateArray[j-1];

            numberOfElements++;
        }

    }

}

但我仍然没有真正理解正在发生的事情

例如,如果我有一行[1,2,3,4,5],如果我把这些数字加在这行的前面或后面,结果会怎样


共 (1) 个答案

  1. # 1 楼答案

    newCoordinateArray[i] = newCoordinateArray[i-1];基本上是将元素向后移动,即索引2处的元素将从索引1获取值,然后索引1将从索引0获取值。最后,索引0将获得新值

    内循环

    这意味着,如果正确,内部循环将[1,2,3,4,5]变成[1,1,2,3,4]

    • [4]=a[3]>;索引4的值将是索引3的值,结果是[1,2,3,4,4]
    • [3]=a[2]>[1,2,3,3,4]
    • a[2]=a[1]>[1,2,2,3,4]
    • a[1]=a[0]>[1,1,2,3,4]

    如果你看这个例子,你应该能够在你的内部循环中发现错误:

    int i = numberOfElements表示i = 5,如果numberOfElements实际上表示rowOfCoordinates.numberOfElements(在本例中为5)。但是,a[5] = ...将导致ArrayOutOfBoundsException,因为5元素数组中的最高索引是4

    外环

    外部循环从最后一个元素(a[0] = a[j-1])开始移动到索引0中。这意味着,在第一次运行内部循环之后,您有[1,1,2,3,4],现在a[0] = a[4]将导致[4,1,2,3,4]

    现在让我们看看外循环的其他迭代:

    • j = 4->;内部循环结果:[4,4,1,2,3]a[0] = a[3]结果为[2,4,1,2,3](在a[3]处的值为2)
    • j = 3->;内部循环结果:[2,2,4,1,2]a[0] = a[2]结果为[4,2,4,1,2](在a[2]处的值为4)
    • j = 2->;内部循环结果:[4,4,2,4,1]a[0] = a[1]结果为[4,4,2,4,1](在a[1]处的值为4)
    • j = 1->;内部循环结果:[4,4,4,2,4]a[0] = a[0]不会改变任何内容,因此最终结果将是[4,4,4,2,4]

    如何在适当的位置移动

    如果要在不创建阵列副本的情况下移动阵列中的元素,即就地移动,可以执行以下操作:

     //replace 1st element
     int replacedIndex = dir;
     int replacedValue = array[replacedIndex];
     array[replacedIndex] = array[0];
         
     //replace all other elements
     for( int i = 1; i < array.length; i++) {
         replacedIndex = (replacedIndex + dir) % array.length;           
         int temp = array[replacedIndex];
         array[replacedIndex] = replacedValue;
         replacedValue = temp;
     }
    

    这意味着:

    将第一个图元移动到其新位置,以替换另一个图元。所以你要追踪被替换的元素,以及它的索引。循环现在移动替换的元素,替换下一次迭代处理的另一个元素

    因此,将[A,B,C,D,E]移动2意味着:

    • 最初将A从索引0移到索引2,这样C将被替换。结果:[A,B,A,D,E]
    • C将从索引2移到索引4:[A,B,A,D,C]
    • E将从索引4移到索引1(环绕):[A,E,A,D,C]
    • B将从索引1移到索引3:[A、E、A、B、C]
    • D将从索引3移到索引0(环绕):[D,E,A,B,C]

    模运算符也可用于允许更大的移位,基本上会被带回到范围内,即将一个4元素数组移位13与将其移位1相同(13%4=1)

    通过增加长度将移位带入正范围,可以支持负移位,即给定一个5元素数组,-1移位(左1移位)与4移位(右4移位)相同

    所以你可以一开始就这么做:

    //copy the initial parameter to keep the original value
    int dir = direction;
    
    //shift direction into a positive range
    while( dir < 0) {
      dir += array.length;
    }
    
    //bring any out-of-range direction back into range
    dir %= array.length;