В каком месте подкорректировать что бы второй номер вносился без имени того же владельца?

public class PhoneBook {

    Map<String,String > Contact=new TreeMap<>();

    public void addContact(String phone, String name) {
        if (phone.matches("[\\d]{11}") && name.matches("[А-Яа-я]+")) {
            if (Contact.containsKey(phone)) {
                Contact.replace(phone, Contact.get(phone), name);
            } else {
                Contact.put(phone, name);
            }
        }
}

    public String getContactByPhone(String phone) {
        if (Contact.containsKey(phone)) {
            return Contact.get(phone) + " - " + phone;
        } else {
            return "";
        }
    }

    public Set<String> getContactByName(String name) {
        TreeSet<String> contactByName= new TreeSet<>();
        for (Map.Entry<String,String> entry: Contact.entrySet()){
            if (entry.getValue().equals(name)){
                String contact =  entry.getValue()+ " - "+entry.getKey();
                contactByName.add(contact);
            }
        }
        return contactByName;
    }

    public Set<String> getAllContacts() {
       TreeSet<String> myContactTree= new TreeSet<>();
       for(Map.Entry<String,String> entry: Contact.entrySet()){
           String key = entry.getKey();
           String value = entry.getValue();
           myContactTree.add(value + " - " + key);
       }
        return myContactTree;
    }

введите сюда описание изображения


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

Автор решения: Nowhere Man

Разумеется, можно сформировать сет телефонов для заданного контакта, в котором для "первого" телефона будет указан сам контакт, но следует заметить, что TreeSet (сортированный сет) при этом не получится использовать напрямую, так как строка, начинающаяся с имени, в лексикографическом порядке будет находиться после номера из цифр, поэтому понадобится использовать кастомный компаратор:

public Set<String> getContactByName(String name) {
    TreeSet<String> contactByName = new TreeSet<>(Comparator.comparing(s -> s.matches("\\p{L}+ - \\d+") ? "" : s));
    for (Map.Entry<String, String> entry: Contact.entrySet()) {
        if (entry.getValue().equals(name)) {
            // добавить имя как префикс к первому найденному телефону
            String contact = contactByName.isEmpty() ? entry.getValue() + " - " + entry.getKey() : entry.getKey();
            contactByName.add(contact);
        }
    }
    return contactByName;
}

Для реализации метода getAllContacts имеет смысл возвращать не сет, а мапу вида Map<String, Set<String>>, данное преобразование можно выполнить при помощи Stream API: Collectors.groupingBy + Collectors.mapping:

public Map<String, Set<String>> getAllContactsMap() {
    return Contact.entrySet() 
        .stream() // Stream<Map.Entry<String, String>>
        .collect(Collectors.groupingBy(
            Map.Entry::getValue,
            TreeMap::new, // сортировка по имени
            Collectors.mapping(
                Map.Entry::getKey, Collectors.toCollection(TreeSet::new)
            ) // сортировка по номеру телефона
        ));
}

При необходимости, такую мапу можно преобразовать в сет, при этом результат будет отсортирован по имени:

public Set<String> getAllContacts() {
    return getAllContactsMap()
        .entrySet()
        .stream()
        .map(e -> e.getKey() + " - " + String.join(", ", e.getValue()))
        .collect(Collectors.toCollection(TreeSet::new));
}

Тест:

addContact("79001234567", "Маша");
addContact("79007654321", "Маша");
addContact("79003332220", "Даша");

System.out.println(Contact);
System.out.println(getAllContactsMap());
System.out.println(getAllContacts());

Результат:

{79001234567=Маша, 79003332220=Даша, 79007654321=Маша}
{Даша=[79003332220], Маша=[79001234567, 79007654321]}
[Даша - 79003332220, Маша - 79001234567, 79007654321]
→ Ссылка
Автор решения: Scruffy the Janitor
if (Contact.containsKey(phone)) {
            Contact.replace(phone, Contact.get(phone), name);

Проверка по ключу - телефон. Если есть ключ телефон в колекции значит, изменить значение где ключ = phone, строе значение =Contact.get(phone) , новое name , результат операции true . Тоже самое можно было сделать Contact.replace(phone,name) или через put. Лучше чтоб ключом было имя

Если телефонов может быть больше чем один, значит значение ключа должен быть массивом или колекцией номеров и при нахождении совпадения , добовлять в туда еще один телефон.

Map<String,List> mymap = new TreeMap<>(); // К примеру
mymap.put("Маша", Arrays.asList("+79522422","+795242422422"); // ну типа такого. 

P.S. Я далеко не гуру языка, но по логике вроде так, если я правильно понял. Ну и лучше Set, чтоб телефоны не повторялись чем List

→ Ссылка