我正在制作一个跟踪比赛的程序。我希望能够将一场比赛从原来的位置移开一定数量的位置,然后让所有的东西向下移动。
我有一个“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.2
和2.0
之间的3个点。请记住,这样做会将对象移动到数组之间,因此必须在三个数组之间移动所有内容。移动后它会是这样的:
0.0, 0.1, 1.0; 1.1, 1.2, 0.2; 2.0, 2.1, 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]
现在我们必须改变数据。这可以这样做:
代码:
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 |
答案 1 :(得分:0)
一个选项可能是在顶级类中只有2个数组:第一个是包含所有种族的Races数组:
Race[] races = {new Race(), ...};
另一个是每轮开始比赛的一系列指标。在您的示例中,它将是:
int[] roundStartIndicies = {0, 3, 6};
然后移动比赛变得容易多了。如果你想获得回合,你也可以轻松完成。例如,如果你想在第二轮中进行第二场比赛,你可以做到
races[roundStartIndicies[1] + 1]
有时以一维方式查看二维问题有助于使代码更清晰。
编辑:这取决于您访问数据的方式,但您可能希望将Races设为HuStmpHrrr建议的LinkedList。但是你会失去对比赛的随机访问时间。