#681·LaZagne

kakak5.java

Author: KazazaevCreated Jun 4, 2026Updated Jun 4, 2026

import java.util.ArrayList;
// ВАРИАНТ 1

class Person implements Comparable { String name; // Поле для хранения имени int age; // Поле для хранения возраста

Person(String name, int age) { 
    this.name = name;  // Сохраняем переданное имя в поле объекта
    this.age = age;    // Сохраняем переданный возраст в поле объекта
}


@Override
public int compareTo(Person p) { 
    return this.age - p.age;  // Возвращает разницу возрастов (отрицательно, 0 или положительно)
}

// Метод toString - возвращает строковое представление объекта
@Override
public String toString() { 
    return name + "(" + age + ")";  // Пример: "Анна(25)"
}

}

// Класс с утилитарным методом для поиска максимума и минимума class ArrayUtils {

// Статический метод - вызывается без создания объекта
// Принимает массив Comparable объектов, возвращает массив из max и min
public static Comparable[] maxAndMin(Comparable[] array) {
    
    // Если в массиве меньше 2 элементов - выбрасываем исключение
    if (array.length < 2) throw new IllegalArgumentException("меньше 2 элементов");
    
    
    Comparable max = array[0];
    Comparable min = array[0];
    
    // Цикл начинается с индекса 1 
    for (int i = 1; i < array.length; i++) {
        
        // Если текущий элемент больше max
        // compareTo > 0 значит array[i] больше max
        if (array[i].compareTo(max) > 0) 
            max = array[i];  // Обновляем максимум
        
        // Если текущий элемент меньше min
        // compareTo < 0 значит array[i] меньше min
        if (array[i].compareTo(min) < 0) 
            min = array[i];  
    }
    
    // Возвращаем новый массив из двух элементов [max, min]
    return new Comparable[]{max, min};
}

}

// ВАРИАНТ 2

// Класс стека, реализует интерфейс Cloneable (разрешает клонирование) class MyStack implements Cloneable {

// Приватное поле - ArrayList для хранения элементов стека
private ArrayList<Object> list = new ArrayList<>();

// Метод push - добавляет элемент на вершину стека
public void push(Object o) { 
    list.add(o);  
}

// Метод pop - удаляет и возвращает верхний элемент стека
public Object pop() { 
    return list.remove(list.size()-1);  // Удаляем последний элемент и возвращаем его
}

// Метод clone - создаёт копию объекта
@Override
public Object clone() {
    try {  
        MyStack c = (MyStack) super.clone();  // super.clone() создаёт поверхностную копию
        c.list = (ArrayList<Object>) list.clone();  
        return c;  // Возвращаем готовую глубокую копию стека
    } catch (CloneNotSupportedException e) {  // Ловим исключение (никогда не произойдёт)
        return null;  // В случае ошибки возвращаем null
    }
}

// Метод toString - возвращает строковое представление стека
@Override
public String toString() { 
    return list.toString();  // Вызываем toString у ArrayList
}

}

// ГЛАВНЫЙ КЛАСС

public class Main {

public static void main(String[] args) {
    
    // ===== ВАРИАНТ 1 =====
    
    
    System.out.println(" ВАРИАНТ 1");
    
    // Создаём массив чисел (Integer автоматически реализует Comparable)
    Comparable[] nums = {5, 2, 8, 1, 9, 3};
    
    // Вызываем метод maxAndMin, получаем массив [max, min]
    Comparable[] res = ArrayUtils.maxAndMin(nums);
    
    // Выводим результат - максимум (индекс 0) и минимум (индекс 1)
    System.out.println("Числа: max=" + res[0] + ", min=" + res[1]);
    
    // Создаём массив строк (String реализует Comparable)
    Comparable[] strs = {"яблоко","груша","апельсин","банан"};
    
    // Вызываем метод maxAndMin для строк
    res = ArrayUtils.maxAndMin(strs);
    
    // Выводим результат (строки сортируются по алфавиту)
    System.out.println("Строки: max=" + res[0] + ", min=" + res[1]);
    
    // Создаём массив объектов Person
    Person[] people = {new Person("Анна",25), new Person("Иван",30), new Person("Мария",20)};
    
    // Вызываем метод maxAndMin для Person (сравниваются по возрасту)
    res = ArrayUtils.maxAndMin(people);
    
    // Выводим результат (старший по возрасту и младший)
    System.out.println("Person: max=" + res[0] + ", min=" + res[1]);
    
    // ВАРИАНТ 2 
    
    
    System.out.println("\n=== ВАРИАНТ 2 ===");
    
    // Создаём первый стек
    MyStack s1 = new MyStack();
    
    // Добавляем элементы в стек (1, 2, 3)
    s1.push(1); 
    s1.push(2); 
    s1.push(3);
    
    // Клонируем стек - создаём глубокую копию
    MyStack s2 = (MyStack) s1.clone();  // (MyStack) - приведение типа
    
    // Изменяем оригинальный стек: удаляем верхний элемент (3)
    s1.pop();      // pop() возвращает 3, но мы его не сохраняем
    s1.push(999);  // Добавляем 999 на вершину
    
    // Выводим оригинал - [1, 2, 999]
    System.out.println("Оригинал: " + s1);
    
    // Выводим клон - [1, 2, 3] (не изменился!)
    System.out.println("Клон:     " + s2);
    
    // Подтверждаем, что клон независим
    System.out.println("Клон независим ");
}

}