Sobes.tech
Middle+
167

Υπολογίστε για κάθε νόμισμα τη διαφορά μεταξύ της μεγαλύτερης και της μικρότερης παραγγελίας τύπου DELIVERY. Επιστρέψτε το αποτέλεσμα για κάθε νόμισμα. Τα νομίσματα πρέπει να είναι ταξινομημένα με αύξουσα σειρά αυτής της διαφοράς. /** * Επιστρέφει έναν χάρτη τύπου {νόμισμα (σε αύξουσα σειρά της διαφοράς) – διαφορά μεταξύ της μεγαλύτερης και της μικρότερης παραγγελίας τύπου DELIVERY για το νόμισμα}. * Αν για κάποιο νόμισμα υπάρχει μόνο μια παραγγελία, τότε αυτή είναι και η μεγαλύτερη και η μικρότερη και η διαφορά είναι 0. * Παράδειγμα εισόδου: * [ * Παραγγελία(DELIVERY, "EUR", 2000), * Παραγγελία(DELIVERY, "USD", 15), * Παραγγελία(DELIVERY, "RUB", 200), * Παραγγελία (PICKUP, "RUB", 1250), * Παραγγελία (DELIVERY, "USD", 35), * Παραγγελία (PICKUP, "USD", 55), * Παραγγελία (DELIVERY, "RUB", 100) * ] * * Αναμενόμενο αποτέλεσμα: * ["EUR" -> 0.0, "USD" -> 20.0, "RUB" -> 100.0] * */ Map<String, Double> getMaxMinusMinDeliveryMapByCurrency(List<OrderData> orderDataList) { }

Εταιρείες όπου ρωτήθηκαν
Мираполис

Απάντηση από AI

sobes.tech AI

Ниже приведена реализация метода на Java, который для списка заказов типа DELIVERY вычисляет для каждой валюты разницу между максимальным и минимальным значением заказа, а затем возвращает результат в виде отсортированной по возрастанию разницы Map:

Map<String, Double> getMaxMinusMinDeliveryMapByCurrency(List<OrderData> orderDataList) {
    Map<String, MinMax> statsByCurrency = new HashMap<>();

    for (OrderData order : orderDataList) {
        if (order == null || order.getType() != Type.DELIVERY) {
            continue;
        }

        String currency = order.getCurrency();
        long amount = order.getAmount();

        statsByCurrency.compute(currency, (key, current) -> {
            if (current == null) {
                return new MinMax(amount);
            } else {
                current.update(amount);
                return current;
            }
        });
    }

    // Преобразуем в список для сортировки
    List<Map.Entry<String, Double>> diffList = statsByCurrency.entrySet().stream()
        .map(e -> Map.entry(e.getKey(), e.getValue().diff()))
        .sorted(Comparator.comparingDouble(Map.Entry::getValue))
        .toList();

    // Создаем LinkedHashMap для сохранения порядка
    Map<String, Double> result = new LinkedHashMap<>();
    for (Map.Entry<String, Double> entry : diffList) {
        result.put(entry.getKey(), entry.getValue());
    }

    return result;
}

Этот код:

  • Фильтрует заказы по типу DELIVERY.
  • Для каждой валюты хранит минимальное и максимальное значение заказа.
  • Вычисляет разницу max - min.
  • Сортирует валюты по возрастанию этой разницы.
  • Возвращает отсортированную Map с валютами и соответствующими разницами.

Если по валюте только один заказ, разница будет 0, что соответствует условию.