在其他数组中移动数组中的元素

时间:2014-09-18 16:45:40

标签: java arrays

我正在制作一个跟踪比赛的程序。我希望能够将一场比赛从原来的位置移开一定数量的位置,然后让所有的东西向下移动。

我有一个“Rounds”数组,每个“Round”都有一个“Races”数组。

Round[] rounds = {new Round(), new Round(), new Round()};

每轮都有一系列种族。

Race[] races = {new Race(), new Race(), new Race()};

我也可以这样表示:

0.0, 0.1, 0.2; 1.0, 1.1, 1.2; 2.0, 2.1, 2.2

我想抓住0.2对象并将其向前移动1.22.0之间的3个点。请记住,这样做会将对象移动到数组之间,因此必须在三个数组之间移动所有内容。移动后它会是这样的:

0.0, 0.1, 1.0; 1.1, 1.2, 0.2; 2.0, 2.1, 2.2

同样,这是在数组之间而不是在同一个数组之间移动对象。

2 个答案:

答案 0 :(得分:1)

这是你可以做的事情。它是您直接问题的解决方案,请查看其他可能更简单,更高效的解决方案的评论。

你可以组织一个数组数组(几乎是一个矩阵),这样外部数组的每个索引都对应一个数组:

index
  0    [0.0, 0.1, 0.2]
  1    [1.0, 1.1, 1.2]
  2    [2.0, 2.1, 2.2]

现在我们必须改变数据。这可以这样做:

  1. 将要移动的元素保存到临时变量中
  2. 移动要移动元素的数组中的所有数据
  3. 将要移动的阵列与要移动的阵列之间的数组中的所有数据移位到
  4. 将要移动元素的数组中的所有数据移到
  5. 将保存的元素从临时变量存储到适当的位置
  6. 代码:

    void move(double[][] arrays, int indexFrom, int posFrom, int indexTo, int posTo) {
    
        // step 1
        double movedElement = arrays[indexFrom][posFrom];
    
        // step 2
        // shift all elements that are to the right of the moved element by 1 position left
        for(int j = posFrom + 1; j < arrays[indexFrom].length; j++) {
            arrays[indexFrom][j - 1] = arrays[indexFrom][j];
        }
    
        // step 3
        // shift all arrays between the array you are moving from 
        // and the array you are moving to
        for(int i = indexFrom + 1; i < indexTo; i++) {
            // move the first element of the next array
            // as the last element of the previous array
            int indexOfLast = arrays[i-1].length - 1;
            arrays[i - 1][indexOfLast] = arrays[i][0];
            // shift remaining elements of the next array
            for(int j = 1; j < arrays[i].length; j++) {
                arrays[i][j - 1] = arrays[i][j];
            }
        }
    
        // step4
    
        // store the first element of the array we are moving to
        // as the last element of the previous array
        int indexOfLast = arrays[indexTo - 1].length - 1;
        arrays[indexTo - 1][indexOfLast] = arrays[indexTo][0];
    
        // starting from the position we are moving to, shift all elements 
        // to the left      
        for(int j = 1; j <= posTo; j++) {
            arrays[indexTo][j - 1] = arrays[indexTo][j];
        }
    
        // step 5
        // store the moved element at its proper position
        arrays[indexTo][posTo] = movedElement;
    }
    

    调用函数将元素从数组0中的位置2移动到数组1中的位置2:

    move(data, 0, 2, 1, 2);
    

    输入:

    | 0.0 0.1 0.2 |
    | 1.0 1.1 1.2 |
    | 2.0 2.1 2.2 |
    

    产生输出:

    | 0.0 0.1 1.0 |
    | 1.1 1.2 0.2 |
    | 2.0 2.1 2.2 |
    

    点击查看full running test code

答案 1 :(得分:0)

一个选项可能是在顶级类中只有2个数组:第一个是包含所有种族的Races数组:

Race[] races = {new Race(), ...};

另一个是每轮开始比赛的一系列指标。在您的示例中,它将是:

int[] roundStartIndicies = {0, 3, 6};

然后移动比赛变得容易多了。如果你想获得回合,你也可以轻松完成。例如,如果你想在第二轮中进行第二场比赛,你可以做到

races[roundStartIndicies[1] + 1]

有时以一维方式查看二维问题有助于使代码更清晰。

编辑:这取决于您访问数据的方式,但您可能希望将Races设为HuStmpHrrr建议的LinkedList。但是你会失去对比赛的随机访问时间。