Задание на лабораторную работу

Нарисуйте диаграммы классов UML для задания 1 по абстрактным классам и для заданий 1, 2, 4 по интерфейсам.

Абстрактные классы

Задание 1.

Дан следующий абстрактный класс

abstract class Animal {

    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    abstract String makeSound();
}

Создайте класс Dog как подкласс Animal и реализуйте метод makeSound(). Создайте класс Cat как подкласс Animal и реализуйте метод makeSound(). Создайте в методе main() объекты каждого из подклассов и вызовите метод makeSound().

Задание 2.

Напишите исходный код классов, приведенных в диаграмме классов UML (методы реализовывать не нужно).

Интерфейсы

Задание 1.

Напишите исходный код класса Point, который реализует следующий интерфейс

interface Movable {
    void setX(double x);
    void setY(double y);
    double getX();
    double getY();

    void moveTo(double x, double y);
}

Задание 2.

Напишите исходный код класса Smartphone, который реализует следующие интерфейсы

interface GPS {
    double[] getCoordinates();
}

interface Cellular {
    void makeCall();
    void receiveCall();
}

Задание 3.

Напишите исходный код интерфейса, приведенного в диаграмме классов UML. Напишите исходный код класса DynamicIntArrayImpl, реализующего этот интерфейс (методы реализовывать не нужно)

Задание на дополнительные баллы. Реализуйте методы класса DynamicIntArrayImpl, чтобы получился рабочий класс. Проверьте корректность его работы.

При вставке элемента, массив должен "раздвигаться", размер массива увеличивается. При вставке элемента по индексу, старый элемент с этим индексом смещается вправо.

При удалении элемента, массив должен "сужаться", размер массива уменьшается.

Задание 4.

Найдите в третьей лабораторной работе задание "Класс IntStack". Исходя из условий задания, разработайте интерфейс Stack с перечнем методов, которые, на ваш взгляд, нужно внести в интерфейс.

Задание 5.

Дан следующий класс

class Car {

    private int price;
    private int year; // ГОД ВЫПУСКА
    private int horsePower;

    // ДОБАВЬТЕ КОНСТРУКТОР С 3 АРГУМЕНТАМИ

    // ДОБАВЬТЕ ГЕТТЕРЫ И СЕТТЕРЫ
}

Сделайте так, чтобы класс реализовывал интерфейс Comparable. Напишите исходный код метода compareTo(). Логика метода следующая:

  • сначала сравнивается цена автомобилей, "больше" тот автомобиль, у которого меньше цена;

  • если цены равны, то сравнивается год выпуска автомобиля, "больше" тот автомобиль, который меньше по возрасте;

  • если возраст одинаковый, то автомобили сравниваются по количеству лошадиных сил. "Больше" тот автомобиль, у которого лошадиных сил больше.

Не используйте типизированный Comparable! Для сравнения используйте только арифметические операторы!

Задание на дополнительные баллы. Приложение SortingList

Скачайте архив с проектом по этому адресу - ссылка.

Данная программа выводит список студентов и позволяет отсортировать их по имени, фамилии и по среднему баллу.

В программе уже реализована сортировка студентов по имени.

Задание состоит в следующем:

  • доделать программу, чтобы по нажатию на соответствующие кнопки происходила сортировка студентов по фамилии и по среднему баллу;

  • задание на дополнительные баллы - доработайте программу так, чтобы при повторном нажатии на ту же кнопку сортировки, осуществлялась обратная сортировка студентов. То есть, при первом нажатии на кнопку "Сортировка по имени" студенты сортировались в прямом порядке (по возрастанию), а при повторном нажатии на эту же кнопку, студенты сортировались в обратном порядке (по убыванию).

Список студентов находится в коллекции students, для сортировки необходимо вызвать у коллекции метод sort() и в этот метод передать объект компаратора.

Что такое компаратор. Базовая операция для почти любой сортировки – сравнение двух элементов. Если вы сортируете обычные числа или строки, сравнение происходит элементарно по известным всем правилам. Но как быть, если вы хотите отсортировать объекты, которые могут иметь десятки полей различных типов?

Для этого существует так называемый компаратор. Компаратор в Java – это объект класса, который реализует интерфейс Comparator. Интерфейс определяет всего один метод compare(), который принимает на вход два объекта типаObject. Если первый объект «меньше» – метод возвращает отрицательное число (обычно это просто -1, но может быть и любое другое отрицательное число), если первый объект «больше» – метод возвращает положительное число (обычно это 1, но может быть и любое другое положительное число), если объекты «равны» – метод возвращает 0.

Задача программиста - прописать нужную логику сравнения и вернуть -1/0/1 в том или ином случае.

Вы создаете класс, указываете, что этот класс реализует интерфейс Comparator и в методе compare() описываете логику сравнения двух объектов. В случае со сравнением двух студентов по имени, код компаратора выглядит следующим образом

public class NameSorter implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        if (o1 instanceof Student && o2 instanceof Student) {
            Student s1 = (Student) o1;
            Student s2 = (Student) o2;
            return s1.getName().compareTo(s2.getName());
        }
        return 0;
    }
}

Обратите внимание, что сначала мы должны убедиться, что оба объекта являются объектами класса Student, после чего делаем нисходящее преобразование.

В данном случае мы сравниваем два поля name у двух объектов класса Student. Так как это тип String, нам нет нужды сравнивать строки «вручную», мы просто можем воспользоваться методом compareTo(), который есть у любого объекта класса String.

Last updated