Значения в массивах являются деталями реализации. Давайте вместо этого посмотрим на состояние каждого поезда.
Например:
@Test
void can_add_a_car() {
Train t1 = new Train("Thomas", 2);
t1.addCars(1, 1, 1);
assertEquals(t1.numberOfCars(), 3);
}
Итак, класс начинает выглядеть примерно так:
public class Train {
private ...instance variables ...
public addCars(int... weights) { ... }
}
Было бы неплохо иметь возможность снять машину тоже
@Test
void can_remove_a_car() {
Train t1 = new Train("Thomas", 2);
t1.addCars(1, 2, 3);
t1.removeCar(2);
assertEquals(t1.numberOfCars(), 2);
assertEquals(t1.weight(), 3);
}
Это может предложить метод, подобный
public int removeCar(int position) {
// TODO: move all the cars up by one
return freightCars[position];
}
public int weight() {
// sum the weights of the cars
}
Слияние автомобилей выглядит следующим образом:
@Test
void can_merge_trains() {
Train t1 = new Train("Thomas", 2);
Train t2 = new Train("Rob", 2);
t1.addCars(1, 1, 1)
t2.addCars(1, 1, 1)
t1.merge(t2);
assertEquals(t1.numberOfCars(), 6);
assertEquals(t2.numberOfCars(), 0);
}
Мы могли бы реализовать этот метод так:
public void mergeCars(Train other) {
for(int k = other.numberOfCars() - 1; k >= 0; k--) {
addCar(other.removeCar());
}
}
Вы также можете добавлять методы для добавления и удаления локомотивов и использовать их в mergeCars.
Могут быть более эффективные способы реализовать копирование массива, чем делать это по одной машине за раз. Вы должны иметь возможность добавлять массовые методы добавления и удаления, если производительность становится проблемой.