Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package binocla;
- import java.util.Map;
- import java.util.Scanner;
- import java.util.TreeMap;
- public class Solution {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- String s = ""; // Для ввода данных
- TreeMap<String, Integer> mapOfValue; // Мапа из валюты и ее количества (USD 10), где USD - ключ, 10 - значение
- TreeMap<String, Integer> mapOfConvert = new TreeMap<>(); // Мапа из валюты и ее стоимости (единой) - c USD 75, где USD - ключ, 75 - значение
- TreeMap<String, TreeMap<String, Integer>> map = new TreeMap<>(); // Глобальная мапа из Имени и мапы с валютой и ее количеством (Alice - <USD, 10>)
- while (!s.contains("$")) { // До тех пор, пока строка не содержит $
- s = in.nextLine();
- String[] v = s.split(" "); // Разбиваю длинную строку на массив строк, разделяя по пробелу: {"t", "Alice", "Bob", "USD", "10"} "10" - СТРОКА (!!!)
- if (v[0].equals("t")) { // Если 0 элемент t, то.....
- mapOfValue = map.get(v[2]); // присваиваю текущей мапе валют и их кол-ва мапу по имени (чтобы учитывать предыдущие значения/переводы)
- if (mapOfValue == null) { // Если до этого не было переводов К второму имени (Bob, Charlie...), то
- mapOfValue = new TreeMap<>(); // завожу мапу (создаю)
- mapOfValue.put(v[3], 0); // кладу по ключу валюту (USD), и ее дефолтное/начальное значение (0)
- }
- if (mapOfValue.containsKey(v[3])){ // Если человек уже ПОЛУЧАЛ перевод в текущей валюте (USD был, USD сейчас), то...
- mapOfValue.merge(v[3], Integer.parseInt(v[4]), Integer::sum); // складываю предыдущее значение и текущее (1 аргумент - беру предыдущее значение, 2 арг - беру текущее значение, 3 арг - сумма 1 и 2 арг (предыдущего и текущего значения). 3 арг можно написать так: (a, b) -> a + b
- }
- if (!mapOfValue.containsKey(v[3])) { // Если валюта разная!!!
- mapOfValue.put(v[3], Integer.parseInt(v[4])); // Создаю новый ключ-валюту и кладу туда текущее значение (было USD 5, перевели EUR 10, стало {USD=5, EUR=10}
- }
- map.put(v[2], (TreeMap<String, Integer>) mapOfValue.clone()); // передаю по имени Bob результат вычислений валют и их имени, но склонированный (!!) т.к. мапа - ссылочный тип данных, а нам нужно все сохранять. clone создает копию (новый участок памяти). Кастуем к HashMap ..., т.к. clone по умолчанию возвращает Object
- mapOfValue.clear(); // Очищает мапу из валют и их количества (подготовка к первому челу; который ОТПРАВЛЯЕТ)
- mapOfValue = map.get(v[1]);
- if (mapOfValue == null) {
- mapOfValue = new TreeMap<>();
- mapOfValue.put(v[3], 0);
- }
- if (mapOfValue.containsKey(v[3])) {
- mapOfValue.merge(v[3], Integer.parseInt(v[4]), (a, b) -> a - b); // Вместо суммы теперь ВЫЧИТАЮ, потому что человек ОТПРАВЛЯЕТ
- }
- if (!mapOfValue.containsKey(v[3])) {
- mapOfValue.put(v[3], -Integer.parseInt(v[4])); // Если не было такой валюты раньше (см. строка 29), то ставлю ее с минусовым значением (у Alice было 10 EUR, отправила 20 Bob'у, у нее осталось -10EUR)
- }
- map.put(v[1], (TreeMap<String, Integer>) mapOfValue.clone());
- mapOfValue.clear();
- }
- if (v[0].equals("c")) {
- mapOfConvert.put(v[1], Integer.parseInt(v[2]));
- }
- }
- TreeMap<String, Integer> summary = new TreeMap<>(); // Мапа из Имени и Переведенных в Единую систему измерения денег (Alice USD 10, c USD 100 -> Alice 100*10 -> Alice 1000)
- for (String names: map.keySet()) { // Бегу циклом по всем именам глобальной мапы
- int cnt = 0; // счетчик для подсчета общих денег (переведенных в единую систему измерения)
- for (Map.Entry<String, Integer> x: mapOfConvert.entrySet()) { // бегу по мапе (ключи И значения) из валюты и ее единого представления (то, что с буквой "c USD 75" ...
- for (Map.Entry<String, Integer> values: map.get(names).entrySet()) { // бегу по мапе валют и их количества каждого имени (Например, Alice={USD=10, EUR=5}, бегу по {USD=10, EUR=5}; иначе говоря бегу по mapOfValue
- if (x.getKey().equals(values.getKey())) { // Если ключ валюты ("c USD 75") СОВПАДАЕТ с ключом мапы из валюты и её количество у имени (Alice={USD(!)=10, EUR(!)=100}
- cnt += x.getValue() * values.getValue(); // Перевожу количество валюты в её единое представление (если c USD 75, тогда 100 USD -> 7500). ТУПО ПЕРЕВОД ВСЕХ ВАЛЮТ ВНУТРИ КАЖДОГО ИМЕНИ
- summary.put(names, cnt); // кладу в мапу из имени и единой системы измерения денег
- }
- }
- }
- }
- for (Map.Entry<String, Integer> v: summary.entrySet()) { // вывод
- System.out.print(v.getKey() + " " + v.getValue() + "\n");
- }
- }
- }
Add Comment
Please, Sign In to add comment