HashMap Java как добавлять по значению?

Как можно добавить элемент в map по значению? Например, мне нужно написать Имя Вася. Программа посмотрит, если Вася есть, то выведет его Номер и Имя, а если Васи нет, то попросит добавить ему номер и сохранит в map. Я вроде как разобрался как добавлять по номеру, а вот как по имени не могу понять.

public static void main(String[] args) {
    // командой LIST вывести весь список в алфавитном порядке с номерами
    // если пользователь пишет номер и он не найден, просит ввести имя, и запоминает номер и имя
    // если номер найден то выводит информацию (номер) (имя)
    // если вводишь имя то выводит информацию (номер)(имя)
    // если такого имени нет то просим ввести номер и запоминаем(имя)(номер)

    HashMap<Integer, String> numbers2Names = new HashMap<>();
    numbers2Names.put(100, "Vasya");
    numbers2Names.put(200, "Petya");
    numbers2Names.put(300, "Grisha");
    numbers2Names.put(400, "Misha");
    numbers2Names.put(500, "Pasha");

    Scanner scanner = new Scanner(System.in);

    for (;;) 
    {
        
        System.out.println("Plz write command ADD- add new person, LIST - show all persons");
        String command = scanner.nextLine();
        
        //вывод всего списка
        if (command.equals("LIST")) 
        {
            for (Map.Entry<Integer, String> item : numbers2Names.entrySet()) 
            {
                System.out.println("Number: " + item.getKey() + " Name: " + item.getValue());
            }
        }

        //добавление по номеру
        if (command.equals("ADD"))
        {
            String name = "";
            int number;
            System.out.println("Plz write number");
            Scanner numScan = new Scanner(System.in);     //считываем с консоли номер
            number = numScan.nextInt();     //сохраняем в переменную

            //проверяем есть ли уже такой номер, если нет то добавляем
            if (numbers2Names.containsKey(number)) 
            {
                // такой номер есть и выводим номер-имя
                System.out.println("this number exists");
                System.out.println("Number: " + number + " Name: " + numbers2Names.get(number));
            } 
            else 
            {                   
                System.out.println("This new Number, Plz write name this number");
                Scanner nameScan = new Scanner(System.in); //считываем с консоли имя
                name = nameScan.nextLine(); // сохраняем в переменную
                numbers2Names.put(number, name); //добавляем в hashmap номер и имя
                System.out.println("person save");                    
            }
        }
    }

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

Автор решения: Anastasiya

Поменяй местами номер с именем Map<String, Long>

И потом (if !map.containsKey(name){..}

UPD

Для того чтобы значения в коллекции были как и ключи, уникальными, есть два способа. Насчет первого: вы можете использовать библиотеку guava и BiMap оттуда - она гарантирует не только уникальность ключей, но и значений, более того, ключ можно получить из нее по значению. Документация : https://www.tutorialspoint.com/guava/guava_bimap.htm

Второй вариант, это перед вставкой проверять, есть ли такое имя, в этом поможет метод containsValue() , и если содержит, то получить пару, например:

String targetName = "Ivan" ;
if(map.containsValue(targetName)) {
for(Map.Entry<Long, String> entry : map.entrySet()) {
if(entry.getValue().equals(targetName){
//some logic 
}
} 
} 

Можно так же заменить на стримы и optional:

map.stream()
.map(Map::entrySet)
.filter(entry - > entry.getValue().equals(targetName))
. orElseGet(() - > //insert) ;

Как то так. Не факт что без ошибок) в среде удобнее чем с телефона

→ Ссылка
Автор решения: lampa

По заданию вижу, что нужно многое поменять:

  • Чтение имени или номера для поиска (сейчас есть только поиск по номеру)

  • Проверка существования как номера, так и имени в таблице (сейчас есть проверка только номера)

  • Проверка номера или имени при добавлении новой записи (сейчас этого нет)

     mainLoop: for (; ; ) {
    
         System.out.println("Plz write command ADD- add new person, LIST - show all persons");
         String command = scanner.nextLine();
    
         //вывод всего списка
         if (command.equals("LIST")) {
             for (Map.Entry<Integer, String> item : numbers2Names.entrySet()) {
                 System.out.println("Number: " + item.getKey() + " Name: " + item.getValue());
             }
         }
    
         //добавление по номеру
         if (command.equals("ADD")) {
             System.out.println("Plz write number or name");
             Scanner numScan = new Scanner(System.in);     //считываем с консоли номер
             String name = numScan.next();     //сохраняем в переменную
             Integer number = null;
    
             // пробуем понять, что это число
             try {
                 number = Integer.parseInt(name);
    
                 // есть номер существует в таблице, то выводим результат
                 if (numbers2Names.containsKey(number)) {
                     // такой номер есть и выводим номер-имя
                     System.err.println("This number exists");
                     System.err.println("Number: " + number + " Name: " + numbers2Names.get(number));
                     continue ;
                 }
             } catch (NumberFormatException e) {
                 // если имя существует в таблице, то выводим результат
                 if (numbers2Names.containsValue(name)) {
                     for (Map.Entry<Integer, String> entry : numbers2Names.entrySet()) {
                         if(entry.getValue().equals(name)) {
                             System.err.println("This name exists");
                             System.err.println("Number: " + entry.getKey() + " Name: " + entry.getValue());
    
                             continue mainLoop;
                         }
                     }
                 }
             }
    
             // если ни номера, ни имени не существует в таблице, то добавляем значение
             if(number != null) {
                 System.out.println("This new Number, Plz write name this number");
    
                 Scanner nameScan = new Scanner(System.in); //считываем с консоли имя
                 name = nameScan.nextLine(); // сохраняем в переменную
    
                 if (numbers2Names.containsValue(name)) {
                     System.err.println("Name already exists");
                 }
                 else {
                     numbers2Names.put(number, name); //добавляем в hashmap номер и имя
                 }
             }
             else {
                 System.out.println("This new Name, Plz write number this name");
    
                 Scanner nameScan = new Scanner(System.in); //считываем с консоли число
                 number = Integer.parseInt(nameScan.nextLine()); // сохраняем в переменную
    
                 if (numbers2Names.containsKey(number)) {
                     System.err.println("Number already exists");
                 }
                 else {
                     numbers2Names.put(number, name); //добавляем в hashmap номер и имя
                 }
             }
         }
     }
    
→ Ссылка