Sobes.tech
Senior
27

Кіріс деректері: OperationId TransactionId ISIN RcvID SndId Quantity OperationId - операцияның бүтін сан идентификаторы TransactionId - транзакцияның бүтін сан идентификаторы ISIN - құралдың жол түріндегі идентификаторы RcvID - алушы клиенттің бүтін сан идентификаторы, егер -1 болса, бұл шығару SndId - жіберуші клиенттің бүтін сан идентификаторы, егер -1 болса, бұл енгізу Quantity - құралдың саны, ондық түрінде OperDate - күннің жол түріндегі форматы [phone] кіріс жолдары келесідей болуы мүмкін: 1 1 RUB [phone] USD [phone] USD [phone] RUB [phone] әр құралдың әр клиент үшін соңғы күндегі санын есептеу керек [phone] USD [phone] USD [phone] RUB 100

Сұралған компаниялар
атон

AI-дан жауап

sobes.tech AI

Міндетті түрде соңғы күнге дейінгі әр клиенттің әр құралдарының санын есептеу үшін:

  1. Барлық операцияларды оқып, өрістерін, соның ішінде күнін талдау.
  2. Максималды күн бойынша операцияларды сүзу (соңғы күн).
  3. Әр операция үшін клиенттің балансын жаңарту:
    • Егер RcvID != -1, клиенттің RcvID құралдарының санын Quantity-ға арттыру.
    • Егер SndId != -1, клиенттің SndId құралдарының санын Quantity-ға кеміту.

Java-да Map қолдану арқылы баланс сақтау мысалы:

import java.util.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class Operation {
    int operationId;
    int transactionId;
    String isin;
    int rcvId;
    int sndId;
    double quantity;
    LocalDate operDate;

    public static Operation parse(String line) {
        String[] parts = line.split(" ");
        Operation op = new Operation();
        op.operationId = Integer.parseInt(parts[0]);
        op.transactionId = Integer.parseInt(parts[1]);
        op.isin = parts[2];
        op.rcvId = Integer.parseInt(parts[3]);
        op.sndId = Integer.parseInt(parts[4]);
        op.quantity = Double.parseDouble(parts[5]);
        op.operDate = LocalDate.parse(parts[6], DateTimeFormatter.ISO_DATE); // күн форматы ISO болуы керек
        return op;
    }
}

public class BalanceCalculator {
    public static void main(String[] args) {
        List<Operation> operations = new ArrayList<>();
        // Мұнда кіріс деректерін оқып, operations-қа талдау жасаймыз

        // Максималды күнді табу
        LocalDate maxDate = operations.stream()
                .map(op -> op.operDate)
                .max(LocalDate::compareTo)
                .orElse(LocalDate.MIN);

        // Соңғы күнге сәйкес операцияларды сүзу
        List<Operation> lastDateOps = new ArrayList<>();
        for (Operation op : operations) {
            if (op.operDate.equals(maxDate)) {
                lastDateOps.add(op);
            }
        }

        // Map<Клиент, Map<Құрал, Сан>>
        Map<Integer, Map<String, Double>> balances = new HashMap<>();

        for (Operation op : lastDateOps) {
            if (op.rcvId != -1) {
                balances.computeIfAbsent(op.rcvId, k -> new HashMap<>())
                        .merge(op.isin, op.quantity, Double::sum);
            }
            if (op.sndId != -1) {
                balances.computeIfAbsent(op.sndId, k -> new HashMap<>())
                        .merge(op.isin, -op.quantity, Double::sum);
            }
        }

        // Балансты шығару
        for (var clientEntry : balances.entrySet()) {
            int clientId = clientEntry.getKey();
            for (var isinEntry : clientEntry.getValue().entrySet()) {
                System.out.printf("Клиент %d-да %.2f құралдары %s\n", clientId, isinEntry.getValue(), isinEntry.getKey());
            }
        }
    }
}

Маңызды: күн форматы талданатын форматқа сәйкес болуы керек (мысалы, ISO 8601). Егер басқа форматта болса, күн парсерін өзгерту керек.

Осылайша, біз енгізуді (sndId = -1) және шығуды (rcvId = -1) дұрыс ескере отырып, клиенттердің балансын соңғы күнге дейін жаңартамыз.