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 шт):
Поменяй местами номер с именем
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) ;
Как то так. Не факт что без ошибок) в среде удобнее чем с телефона
По заданию вижу, что нужно многое поменять:
Чтение имени или номера для поиска (сейчас есть только поиск по номеру)
Проверка существования как номера, так и имени в таблице (сейчас есть проверка только номера)
Проверка номера или имени при добавлении новой записи (сейчас этого нет)
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 номер и имя } } } }