package com.javarush.task.task19.task1920;

/* 
Самый богатый

В метод main первым параметром приходит имя файла.
В этом файле каждая строка имеет следующий вид:
имя значение
String.

Для каждого имени посчитать сумму всех его значений.
Вывести в консоль имена в алфавитном порядке, у которых максимальная сумма.
Имена разделять пробелом либо выводить с новой строки.
Закрыть потоки.

Пример входного файла:
Петров 0.501
Иванов 1.35
Петров 0.85

Пример вывода:
Петров


Валидатор задачу не пропускает:
Программа должна выводить в консоль имена, у которых максимальная сумма.


На файлах в кодировке UTF-8 без BOM все отрабатавает как надо.
Но если сделать кодировку UTF-8 (c BOM), то у визуально одинаковых строк - будет разный hashcode.
А так как сравнение у map построено на хэш коде, появляются дупликаты в map. И может быть валидатор
проверяет данные на основе своего файла в этой кодировке (c BOM) и - поэтому не проходит...
Но чтобы проверить это - лучше читать в байтах, а валидатор ругается если применить не FileReader. Вот ведь...

Тестовый файл:
Петров 0.85
Петров 0.85
Петров 0.6332
Петров 0.6332
Петров 0.6332
Иванов 1.35
Сидоров 1.2
Эльман 3.5995999999999997
Сидоров 0.85

Вывод:
Петров
Эльман
*/

import java.io.*;
import java.util.Map;
import java.util.TreeMap;

public class Solution {
    public static void main(String[] args) throws IOException {

        TreeMap<String, Double> map = new TreeMap<>();
        BufferedReader fileReader = new BufferedReader(new FileReader(args[0]));

        double max = 0;
        while (fileReader.ready()) {
            String s = fileReader.readLine();
            String[] strs = s.split(" ");
            String key = strs[0];
            double value = Double.parseDouble(strs[1]);
            max = value;
            if (map.containsKey(key)) {
                map.put(key, map.get(strs[0]) + value);
            } else
                map.put(key, value);
        }
        fileReader.close();

        //Max
        for (Double a : map.values())
            if (max < a)
                max = a;

        //show
        for (Map.Entry<String, Double> pair : map.entrySet())
            if (pair.getValue() == max)
                System.out.print(pair.getKey()+" ");
    }

}

@@ -1360,17 +1360,16 @@
 ption %7B%0A
-%0A
         
@@ -1518,17 +1518,32 @@
 e max = 
-0
+Double.MIN_VALUE
 ;%0A      
@@ -1656,17 +1656,38 @@
 .split(%22
- 
+%5B%5C%5Cs%5C%5Ct%5C%5Cn%5C%5Cx0B%5C%5Cf%5C%5Cr%5D
 %22);%0A    
@@ -1776,33 +1776,8 @@
 %5D);%0A
-            max = value;%0A
     
@@ -2178,16 +2178,21 @@
 ue()
- == 
+.equals(
 max)
+)
 %0A   
@@ -2220,16 +2220,18 @@
 ut.print
+ln
 (pair.ge
@@ -2240,12 +2240,8 @@
 ey()
-+%22 %22
 );%0A 
@@ -2245,11 +2245,10 @@
 ;%0A    %7D%0A
-%0A
 %7D%0A

Task 1920 has Done