В HashMap присвоить значения для повторяющихся ключей

Нужно чтобы когда ключ URL встречается более одного раза его значение в карте менялось на то число раз, которое он встречается Например:

1360884969.868    593 192.168.66.1 TCP_MISS/200 517 CONNECT rs.mail.ru:443 - SOURCEHASH_PARENT/192.168.254.4 -
1360884969.869    521 192.168.66.1 TCP_MISS/200 517 CONNECT rs.mail.ru:443 - SOURCEHASH_PARENT/192.168.254.4 -

Если URL rs.mail.ru встречается 2 раза и тогда нужна карта (rs.mail.ru, 2)

Мой код:

public static void main(String[] args) throws Exception {
    File file = new File("C:\\java\\access.log");
    Map<String, Integer> map = new HashMap<>();

    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        int i = -1;
        String line;
        while ((line = br.readLine()) != null) {
            String[] data = line.split("\\s+");
            String URL = data[7];
            i++;
            map.merge(URL, i, (a, b) -> b + 1);
        }
        System.out.println(map);
    }
}

Сейчас выводится в консоль:

{-=2142227}

Либо так:

public static void main(String[] args) throws Exception {
    File file = new File("C:\\java\\access.log");
    Map<String, Integer> map = new HashMap<>();

    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        int i = 0;
        String line;
        while ((line = br.readLine()) != null) {
            String[] data = line.split("\\s+");
            String URL = data[7];
            if (map.containsKey(URL)) {
                map.put(URL, i + 1);
                i++;
            } else
                map.put(URL, i);
        }
        System.out.println(map);
    }
}

Но выводится то же самое.

Сейчас я думаю он просто для каждое i от предыдущей строки суммирует с i для новой строки, но уже тут эти i неверные.


Ответы (1 шт):

Автор решения: Aziz Umarov

Имея

1360884969.868    593 192.168.66.1 TCP_MISS/200 517 CONNECT rs.mail.ru:443 - SOURCEHASH_PARENT/192.168.254.4 -
1360884969.869    521 192.168.66.1 TCP_MISS/200 517 CONNECT rs.mail.ru:443 - SOURCEHASH_PARENT/192.168.254.4 -

Примерно так

public static void main(String[] args) throws Exception {
    File file = new File("C:\\java\\access.log");
    Map<String, Integer> map = new HashMap<>();

    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String line;
        while ((line = br.readLine()) != null) {
            String[] data = line.split("\\s+");
            String URL = data[6];
            if (map.containsKey(URL)) {
                map.put(URL, map.get(URL) + 1);
            } else map.put(URL, 1);
        }
        System.out.println(map);
    }
}

результат

{rs.mail.ru:443=2}

Идея такая: вы должны по ключам, которые повторяются, инкрементировать значение по ключу

map.put(URL, map.get(URL) + 1);

которое было добавлено с единичкой в начале

map.put(URL, 1);
→ Ссылка