Senior
Java 1.5-dən əvvəl mövcud olan modern enum (enum) kimi öz hesablanmış növünüzü həyata keçirin. Java-nın müasir enum müqaviləsinə uyğun olmalıdır: • hər hansı enum dəyərinə asanlıqla daxil olmaq • dəyərlərin referensiyaya görə təhlükəsiz müqayisəsi (==) • hər dəyər, dəyər adını uyğunlaşdıran bir sətir adına malikdir • hər dəyər, enum-da elan edilən ardıcıllıqda nömrəni saxlayan tam ədədi `ordinal` identifikatoruna malikdir • bütün enum dəyərlərinin siyahısını əldə etmək mümkündür • `ordinal` ilə dəyəri əldə etmək mümkündür • ad ilə dəyəri əldə etmək mümkündür Məsələn, valyutaların siyahısını götürə bilərsiniz. Siyahının potensial olaraq genişlənə bilən olması vacibdir, çünki kodun keyfiyyəti gələcəkdə enum-a dəyərlər əlavə etməyin nə qədər problemsiz olacağını müəyyən edəcək. class Currency { // TODO } --- İstifadəçi sifarişləri cədvəli təqdim edilmişdir |ts|user_id|order_value| Hər istifadəçi üçün, onun ilk alış-verişinin cəmını qaytarın.
sobes.tech Süni İntellekt
AI-dan cavab
До появления enum в Java 1.5 можно было реализовать перечислимый тип с помощью класса и статических констант. Вот пример реализации класса Currency, который удовлетворяет перечисленным требованиям:
import java.util.*;
public class Currency {
private static final List<Currency> VALUES = new ArrayList<>();
private final String name;
private final int ordinal;
// Приватный конструктор
private Currency(String name) {
this.name = name;
this.ordinal = VALUES.size();
VALUES.add(this);
}
// Определение значений
public static final Currency USD = new Currency("USD");
public static final Currency EUR = new Currency("EUR");
public static final Currency GBP = new Currency("GBP");
// Получить имя
public String name() {
return name;
}
// Получить ordinal
public int ordinal() {
return ordinal;
}
// Получить все значения
public static Currency[] values() {
return VALUES.toArray(new Currency[0]);
}
// Получить по имени
public static Currency valueOf(String name) {
for (Currency c : VALUES) {
if (c.name.equals(name)) {
return c;
}
}
throw new IllegalArgumentException("No enum constant Currency." + name);
}
@Override
public String toString() {
return name;
}
}
Такой класс:
- Хранит все значения в списке VALUES.
- Присваивает каждому значению уникальный ordinal по порядку создания.
- Позволяет получить все значения через метод
values(). - Позволяет получить значение по имени через
valueOf(String). - Сравнение по ссылке работает, так как все значения — это статические константы.
Для SQL-запроса, чтобы для каждого пользователя получить сумму первой покупки из таблицы user_orders:
SELECT user_id, SUM(order_value) AS first_order_sum
FROM user_orders uo1
WHERE ts = (
SELECT MIN(ts) FROM user_orders uo2 WHERE uo2.user_id = uo1.user_id
)
GROUP BY user_id;
Этот запрос находит минимальную дату покупки для каждого пользователя и суммирует значения заказов, сделанных в этот момент (если несколько заказов в одно время).