Как объединить два объекта в Java? - PullRequest
0 голосов
/ 22 мая 2019

Для выполнения домашнего задания мне нужно объединить два объекта в Java. Я должен создать метод void mergeTrains(Train other), который добавит все локомотивы и вагоны из другого поезда в текущий поезд. Поэтому после вызова train1.mergeTrains(train2) у поезда параметров не будет вагонов и локомотивов. Все они будут добавлены в train1.

Затем мы должны использовать JUnit для проверки правильности объединения массивов и локомотивов. Вот что у меня есть:

public class Train {

    // data members
    private String trainName;
    private int numOfLocomotives;
    private int[] freightCars;

    // constructor
    public Train (String trainName, int numOfLocomotives) {
        this.trainName = trainName;
        this.numOfLocomotives = numOfLocomotives;
    }

    public int getNumOfLocomotives() {
        return numOfLocomotives;
    }

    public void setNumOfLocomotives(int numOfLocomotives) {
        if (numOfLocomotives < 0) {
            System.out.println("Error. Locomotives can't be set to less than 0.");
            return;
        } else {
            this.numOfLocomotives = numOfLocomotives;
        }
    }

    public int[] getFreightCars(int... freightCars) {
        if (freightCars == null) {
            System.out.println("There are no freight cars in the list.");
            return freightCars;
        } else {
            return freightCars;
        }
    }

    public int[] removeAllCars(int...freightCars) {
        freightCars = null;
        return freightCars;
    }

    public int[] addCars(int...weights) {
        int count = 0;
        int[] freightCars = {10, 20, 30}; // used to check if method functions correctly
        int[] newTrain = new int[freightCars.length + weights.length];
        for (int i = 0; i < freightCars.length; i++) {
            newTrain[i] = freightCars[i];
            count++;
        }
        for (int j = 0; j < weights.length; j++) {
            newTrain[count++] = weights[j];
        }
        for (int i = 0; i < newTrain.length; i++) {
            System.out.print(newTrain[i] + " ");
        }
        return newTrain;
    }

    public void mergeTrains(Train other) {
        this.numOfLocomotives = this.numOfLocomotives + other.numOfLocomotives;
        other.numOfLocomotives = 0;

    }

А вот мой тестовый класс JUnit:

class TestTrain {

    int[] train1Cars = {10, 20, 30};
    int[] train2Cars = {4, 11, 15};
    int[] mergedTrain = {10, 20, 30, 4, 11, 15};

    @Test
    void testRemoveCars() {
        Train t1 = new Train("Thomas", 2);
        assertArrayEquals(t1.removeAllCars(train1Cars), null);
    }

    @Test
    void testAddCars() {
        Train t1 = new Train ("Thomas", 2);
        assertArrayEquals(t1.addCars(train2Cars), mergedTrain);
    }

    @Test
    void testMergeTrains() {
        Train t1 = new Train ("Thomas", 1);
        Train other = new Train ("Rob", 4);
    }
}

В основном мне нужно выяснить, что я должен делать с параметром Train other. И как мне это проверить с помощью JUnit. Я думаю, что правильно с изменением локомотивов в методе mergeTrains, но я также не знаю, как это проверить в JUnit.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Значения в массивах являются деталями реализации. Давайте вместо этого посмотрим на состояние каждого поезда.

Например:

    @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.

Могут быть более эффективные способы реализовать копирование массива, чем делать это по одной машине за раз. Вы должны иметь возможность добавлять массовые методы добавления и удаления, если производительность становится проблемой.

0 голосов
/ 22 мая 2019

Я думаю, что когда вы объединяете один поезд в другой, вы добавляете локомотивы из поезда train2 в train1, а затем добавляете грузовые вагоны из массива train2 в массив в train1. Этот последний шаг будет включать в себя копирование массивов. Я рекомендую вам взглянуть на метод Java System.arraycopy(), чтобы сделать это.

Чтобы выполнить обе эти операции, вы должны использовать экземпляр Поезда, переданный методу слияния.

Я бы также ожидал, что локомотивы и двигатели в train2 будут обнулены. Новый, пустой массив может быть использован для замены старого массива. Но это зависит от того, как ваш инструктор ожидает, что вы укажете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...