воскресенье, 12 июня 2016 г.

Анаграммы решение с помощью Map Java SE

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

Входная строка: «123 456 231 546 231 312 4556»

Результат:
123 231 231 312
456 546
4556

Для того чтобы понять как решить данную задачу предлагаю ознакомиться с интерфейсом Map. В данном видеоуроке на практике показано как пользоватья Map.


После данного урока. Решить задачу не составит труда. Привожу код решения с комментариями в коде.

import java.util.*;

public class Anagram {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);    
        System.out.println("Введите слова через пробел: ");
        String   text = in.nextLine();    // cчитываем одну строку целиком
        String[] words = text.split(" "); // переводим строку в массив строк
        
        Map<String, String> map = new HashMap<String,String>();
        for(int i = 0; i <= words.length - 1; i++){
        String tmpWord = words[i]; // присваиваем в t слово из массива
        char [] sym = words[i].toCharArray(); // преобразуем элемент массива в набор символов
            
        Arrays.sort(sym); // сортируем массив по возрастанию т.е. на 
                                     // входе получаем 321 на выходе получаем 123
            
        String wordkey = new String(sym); // преобразуем массив символов в строку
            
        String value = map.get(wordkey); 
        if(value == null){
            map.put(wordkey, tmpWord );  
        }else{
             map.put(wordkey, value + " " + tmpWord); 
        }            
        }
         System.out.println();
        for(String k2 : map.values()){
           System.out.println(k2);
        }
    }
}

Здесь появилась маленька ошибочка. Слова с разным регистром букв  не будут являться анаграммами. Решается данная проблема с помощью комманды которая переводит всю строку к строчному виду.
    text = text.toLowerCase;
Ее нужно вставить перед тем как мы передем строку в массив строк.

Комментариев нет:

Отправить комментарий