Запутался с множествами, нужна помощь

90
24 апреля 2021, 02:50

Есть следующая задача:

Вводится несколько строк по два слова в каждой - имена двух друзей. Дружба - вещь взаимная(с двух сторон!!!). Иначе люди - не друзья.

Необходимо вывести ответ в соответствии с примерами ниже - список друзей. Список состоит из имен людей, список выстроен в лексографическом порядке(по алфавиту) по возрастанию, после имени человека идет фраза " дружит с : ", далее следует список имен его друзей, выстроенный так же по возрастанию.

Пример_1
Ввод:
Mike Nike
Oleg Petr
Mike Petr
Ivan Oleg
Вывод:
Ivan дружит с : Oleg 
Mike дружит с : Nike Petr 
Nike дружит с : Mike 
Oleg дружит с : Ivan Petr 
Petr дружит с : Mike Oleg 
Пример_2:
Ввод:
Петр Иван
Иван Петр
Олег Иван
Петр Олег
Вывод:
Иван дружит с : Олег Петр 
Олег дружит с : Иван Петр 
Петр дружит с : Иван Олег 

Код у меня такой вот:

public class TestClass {
    private static Map<String, List<String>> friends = new TreeMap<>();
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] pairs;
        List<String> list = new ArrayList();
        while (in.hasNext()) {
            String s = in.nextLine();
            list.add(s);
        }
        for (String pair : list) {
            addFriends(pair);
        }
        printAllFriends();
    }
    public static void addFriends(String pair) {
        String first = pair.split(" ")[0];
        String second = pair.split(" ")[1];
        put(first, second);
        put(second, first);
    }
    private static void put(String one, String two) {
        if (!friends.containsKey(one)) {
            friends.put(one, new ArrayList<>());
        }
        friends.get(one).add(two);
    }
    public static void printAllFriends() {
        for (Map.Entry<String, List<String>> pair : friends.entrySet()) {
            pair.getValue().sort(Comparator.naturalOrder());
            System.out.println( pair.getKey() + " дружит с : " + String.join(" ",pair.getValue()));;
        }
    }
}

Все нормально с первым тестом - проходит, но на втором валится...такое чувство что не в алфавитном порядке сортирует и выводит, хотя вроде бы правильно все написал. Дайте добрый совет, что поправить чтоб работало?

Answer 1

Просто замените List на TreeSet в мапе friends.

private static Map<String, TreeSet<String>> friends = new TreeMap<>();

Два последних метода тогда записываются так:

private static void put(String one, String two) {
    if (!friends.containsKey(one)) {
        friends.put(one, new TreeSet<>());
    }
    friends.get(one).add(two);
}
public static void printAllFriends() {
    for (Map.Entry<String, TreeSet<String>> pair : friends.entrySet()) {
        System.out.println( pair.getKey() + " дружит с : " + String.join(" ",pair.getValue()));;
    }
}

Вывод был неправильный из-за того, что имена дублировались.
Теперь же не нужно ни сортировать список имён, ни убирать дубликаты, это за вас сделает TreeSet.

READ ALSO
Создание спецификации в цикле

Создание спецификации в цикле

Всем привет, такой вопросЕсть список который может содержать более 1000 элементов, по которому надо сделать сравнение

97
Одна Entity и Две @OneToOne анотации

Одна Entity и Две @OneToOne анотации

В таблице Location содержится информация которая должна выбираться согласно связи charactersorigin_id reference to location

109
Как докачать расширения в Android Studio?

Как докачать расширения в Android Studio?

При первом запуске Android Studio возникает окно, с помощью которого можно установить все необходимые расширения, но после создания первого проекта,...

94
Кластеризация в Mapbox с использованием SymbolManager

Кластеризация в Mapbox с использованием SymbolManager

Пытаюсь сделать кластеризацию в приложении с использованием библиотеки mapbox и их плагина аннотацийВ разрабатываемом приложении необходимо...

104