Senior
Invoergegevens OperationId TransactionId ISIN RcvID SndId Quantity OperationId - operation-ID (geheel getal) TransactionId - transactie-ID (geheel getal) ISIN - instrument-ID (string) RcvID - ontvanger-klant-ID (geheel getal), als -1, dan is het een uitgang SndId - verzender-klant-ID (geheel getal), als -1, dan is het een invoer Quantity - hoeveelheid van het instrument (double) OperDate - datum in het formaat [phone] Invoerregels, bijvoorbeeld 1 1 RUB [phone] USD [phone] USD [phone] RUB [phone] Het is nodig om de hoeveelheid van elk instrument voor elke klant op de laatste datum te tellen [phone] USD [phone] USD [phone] RUB 100
sobes.tech AI
Antwoord van AI
Для решения задачи подсчёта количества каждого инструмента у каждого клиента на последнюю дату нужно:
- Считать все операции, парсить поля, включая дату.
- Отфильтровать операции по максимальной дате (последней).
- Для каждой операции обновить баланс клиента:
- Если 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("Client %d has %.2f of %s\n", clientId, isinEntry.getValue(), isinEntry.getKey());
}
}
}
}
Важно, чтобы дата была в формате, который можно распарсить (например, ISO 8601). Если формат другой, нужно подстроить парсер даты.
Таким образом, мы учитываем ввод (sndId = -1) и вывод (rcvId = -1) корректно, обновляя балансы клиентов на последнюю дату.