Как мне обработать дубликаты ключей в HashMaps в Java? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть HashMap. Я написал метод для чтения и печати файлов, но я просто подумал, что HashMap не допускает дублирования ключей в файле, поэтому мне нужно что-то с этим сделать, например, сохранить тот же ключ, но с каким-то символом в конце (например, _ или что-то подобное, чтобы они отличались друг от друга). Я не могу придумать решение (возможно, я мог бы поймать исключение просто написать блок if). Не могли бы вы мне помочь?

public static HashMap<String, String> hashmapReader(File test3) {
    HashMap<String, String> data = new HashMap<>(); 
    try (BufferedReader hmReader = new BufferedReader(new FileReader(test3))) {
        String line;
        while ((line = hmReader.readLine()) != null) {
            String[] columns = line.split("\t");
            String key = columns[0];
            String value = columns[1];
            data.put(key, value); 
        }
    } catch (Exception e) {
        System.out.println("Something went wrong"); 
    }
    return data;
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы можете добавить элемент управления на ключ, если он уже существует в HashMap data. Для этого вы можете использовать get(key) метод HashMap Java Class , который возвращает null , если ключ не существует :

if(data.get(key) != null)
         key = key + "_";
data.put(key, value); //adding the split line array to the ArrayList

Если он уже существует (не вернул ноль ), вы можете изменить его имя, добавив в конце символ, например, "_", как вы сказали.

РЕДАКТИРОВАТЬ : Ответ выше моего указал мне факт: «Что, если существует более 2 одинаковых ключей?». По этой причине я рекомендую следовать его решению вместо моего.

1 голос
/ 26 апреля 2020

Для достижения того, что вы на самом деле просите:

Перед вашей put строкой:

while (data.containsKey(key)) key += "_";
data.put(key, value);

При этом будет продолжаться проверка карты, чтобы увидеть, существует ли key, и если это так, он добавляет _ в конец и пытается снова.

Вы можете сделать эти две строки в одной:

while (data.putIfAbsent(key, value) != null) key += "_";

Это в основном то же самое, но это просто избегает необходимости искать дважды в случае, если ключ не найден (и, следовательно, значение должно быть вставлено).


Однако подумайте, действительно ли это лучше всего сделать: как Затем вы будете искать вещи по «ключу», если вы, по сути, составили ключи во время их чтения.

Вы можете сохранить несколько значений на ключ, используя тип значения, в котором хранятся несколько значений, например, List<String>.

HashMap<String, List<String>> data = new HashMap<>(); 
// ...
data.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...