liwgfr

Untitled

Mar 22nd, 2021 (edited)
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.64 KB | None | 0 0
  1. package binocla;
  2.  
  3. import java.util.Map;
  4. import java.util.Scanner;
  5. import java.util.TreeMap;
  6.  
  7. public class Solution {
  8.     public static void main(String[] args) {
  9.         Scanner in = new Scanner(System.in);
  10.         String s = ""; // Для ввода данных
  11.  
  12.         TreeMap<String, Integer> mapOfValue; // Мапа из валюты и ее количества (USD 10), где USD - ключ, 10 - значение
  13.         TreeMap<String, Integer> mapOfConvert = new TreeMap<>(); // Мапа из валюты и ее стоимости (единой) - c USD 75, где USD - ключ, 75 - значение
  14.         TreeMap<String, TreeMap<String, Integer>> map = new TreeMap<>(); // Глобальная мапа из Имени и мапы с валютой и ее количеством (Alice - <USD, 10>)
  15.  
  16.         while (!s.contains("$")) { // До тех пор, пока строка не содержит $
  17.             s = in.nextLine();
  18.             String[] v = s.split(" "); // Разбиваю длинную строку на массив строк, разделяя по пробелу: {"t", "Alice", "Bob", "USD", "10"} "10" - СТРОКА (!!!)
  19.             if (v[0].equals("t")) { // Если 0 элемент t, то.....
  20.                 mapOfValue = map.get(v[2]); // присваиваю текущей мапе валют и их кол-ва мапу по имени (чтобы учитывать предыдущие значения/переводы)
  21.                 if (mapOfValue == null) { // Если до этого не было переводов К второму имени (Bob, Charlie...), то
  22.                     mapOfValue = new TreeMap<>(); // завожу мапу (создаю)
  23.                     mapOfValue.put(v[3], 0); // кладу по ключу валюту (USD), и ее дефолтное/начальное значение (0)
  24.                 }
  25.                 if (mapOfValue.containsKey(v[3])){ // Если человек уже ПОЛУЧАЛ перевод в текущей валюте (USD был, USD сейчас), то...
  26.                     mapOfValue.merge(v[3], Integer.parseInt(v[4]), Integer::sum); // складываю предыдущее значение и текущее (1 аргумент - беру предыдущее значение, 2 арг - беру текущее значение, 3 арг - сумма 1 и 2 арг (предыдущего и текущего значения). 3 арг можно написать так: (a, b) -> a + b
  27.                 }
  28.                 if (!mapOfValue.containsKey(v[3])) { // Если валюта разная!!!
  29.                     mapOfValue.put(v[3], Integer.parseInt(v[4])); // Создаю новый ключ-валюту и кладу туда текущее значение (было USD 5, перевели EUR 10, стало {USD=5, EUR=10}
  30.                 }
  31.                 map.put(v[2], (TreeMap<String, Integer>) mapOfValue.clone()); // передаю по имени Bob результат вычислений валют и их имени, но склонированный (!!) т.к. мапа - ссылочный тип данных, а нам нужно все сохранять. clone создает копию (новый участок памяти). Кастуем к HashMap ..., т.к. clone по умолчанию возвращает Object
  32.                 mapOfValue.clear(); // Очищает мапу из валют и их количества (подготовка к первому челу; который ОТПРАВЛЯЕТ)
  33.                 mapOfValue = map.get(v[1]);
  34.                 if (mapOfValue == null) {
  35.                     mapOfValue = new TreeMap<>();
  36.                     mapOfValue.put(v[3], 0);
  37.                 }
  38.  
  39.                 if (mapOfValue.containsKey(v[3])) {
  40.                     mapOfValue.merge(v[3], Integer.parseInt(v[4]), (a, b) -> a - b); // Вместо суммы теперь ВЫЧИТАЮ, потому что человек ОТПРАВЛЯЕТ
  41.                 }
  42.                 if (!mapOfValue.containsKey(v[3])) {
  43.                     mapOfValue.put(v[3], -Integer.parseInt(v[4])); // Если не было такой валюты раньше (см. строка 29), то ставлю ее с минусовым значением (у Alice было 10 EUR, отправила 20 Bob'у, у нее осталось -10EUR)
  44.                 }
  45.                 map.put(v[1], (TreeMap<String, Integer>) mapOfValue.clone());
  46.                 mapOfValue.clear();
  47.             }
  48.             if (v[0].equals("c")) {
  49.                 mapOfConvert.put(v[1], Integer.parseInt(v[2]));
  50.             }
  51.         }
  52.        TreeMap<String, Integer> summary = new TreeMap<>(); // Мапа из Имени и Переведенных в Единую систему измерения денег (Alice USD 10, c USD 100 -> Alice 100*10 -> Alice 1000)
  53.             for (String names: map.keySet()) { // Бегу циклом по всем именам глобальной мапы
  54.                 int cnt = 0; // счетчик для подсчета общих денег (переведенных в единую систему измерения)
  55.                 for (Map.Entry<String, Integer> x: mapOfConvert.entrySet()) { // бегу по мапе (ключи И значения) из валюты и ее единого представления (то, что с буквой "c USD 75" ...
  56.                     for (Map.Entry<String, Integer> values: map.get(names).entrySet()) { //  бегу по мапе валют и их количества каждого имени (Например, Alice={USD=10, EUR=5}, бегу по {USD=10, EUR=5}; иначе говоря бегу по mapOfValue
  57.                       if (x.getKey().equals(values.getKey())) { // Если ключ валюты ("c USD 75") СОВПАДАЕТ с ключом мапы из валюты и её количество у имени (Alice={USD(!)=10, EUR(!)=100}
  58.                             cnt += x.getValue() * values.getValue(); // Перевожу количество валюты в её единое представление (если c USD 75, тогда 100 USD -> 7500). ТУПО ПЕРЕВОД ВСЕХ ВАЛЮТ ВНУТРИ КАЖДОГО ИМЕНИ
  59.                             summary.put(names, cnt); // кладу в мапу из имени и единой системы измерения денег
  60.                       }
  61.                 }
  62.             }
  63.         }
  64.         for (Map.Entry<String, Integer> v: summary.entrySet()) { // вывод
  65.             System.out.print(v.getKey() + " " + v.getValue() + "\n");
  66.         }
  67.  
  68.     }
  69. }
  70.  
Add Comment
Please, Sign In to add comment