Как исправить двойное слово arraylist в hashmap? - PullRequest
0 голосов
/ 09 ноября 2019

Создайте программу, которая может сортировать слова по первой букве. Начните с обычного зацикленного приложения. Ваши данные будут храниться в «Карта строк в список строк». Каждый раз, когда пользователь вводит слово, посмотрите на первую букву и добавьте его в правильный список. После того, как они выйдут, распечатайте все слова для каждой буквы.

public static void main(String[] args) {

    Map<String, ArrayList<String>> MyMap = new HashMap<String, ArrayList<String>>();
    ArrayList<String> MyList = new ArrayList<String>();

    Scanner scanner = new Scanner(System.in);

    int input;
    String MyString = null;

    while (true) {
        System.out.println("Press (1) to enter a word. n/Press (2) to exit.");
        while (!scanner.hasNextInt()) {
            scanner.next();
            System.out.println("Need to press number (1) or (2)");
        }
        input = scanner.nextInt();
        if (input == 1) {
            System.out.println("Enter a word:");
            MyString = scanner.next();
        }
        if (MyMap.containsKey(MyString.substring(0, 1))) {
            MyMap.get(MyString.substring(0, 1)).add(MyString);
        }
        if (!MyMap.containsKey(MyString.substring(0, 1))) {
            MyList = new ArrayList<String>();
            MyList.add(MyString);
            MyMap.put(MyString.substring(0, 1), MyList);
        }
        if (input == 2) {
            MyMap.entrySet().forEach(entry -> {
                System.out.println(entry.getKey() + " " + entry.getValue());
            });
            break;
        }
    }

    scanner.close();

}

Мой вывод распечатает дубликат последнего слова, которое я ввожу.

Например:

Введите слово: aa ab ba bc Нажмите (1), чтобы ввести слово. Нажмите (2) для выхода. 2 a [aa, ab] b [ba, bc, bc]

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Вы можете изменить тип карты в соответствии с вашими потребностями:

Map<String, LinkedHashSet<String>>

Дублированные значения не будут вставлены в набор, и вы сохраните порядок вставки.

Map<Character, LinkedHashSet<String>> 

кажется еще более точным, поскольку вам нужны только символы в значениях ключа.

0 голосов
/ 09 ноября 2019

Вы проверяете только, если input равно 1, прежде чем присваивать новое значение MyString, но когда input не равно 1 (например, 2), вы продолжаете с предыдущим значением (например, * 1007). * второй раз). Измените

if (input == 1) {
    System.out.println("Enter a word:");
    MyString = scanner.next();
}

, чтобы добавить else;как

if (input == 1) {
    System.out.println("Enter a word:");
    MyString = scanner.next();
} else {
    continue;
}

Кроме того, вы должны следовать соглашениям об именах Java. MyString выглядит как имя класса. Вместо else вы можете переместить следующую логику вверх;(Я немного рефакторинг). Мол,

if (input == 1) {
    String s = MyString.substring(0, 1);
    if (!MyMap.containsKey(s)) {
        MyMap.put(s, new ArrayList<>());
    }
    MyMap.get(s).add(MyString);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...