Недавно мне попалась следующая задача которая вызвала не мало трудностей из за моего незнания интерфейса 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;
Ее нужно вставить перед тем как мы передем строку в массив строк.
Ее нужно вставить перед тем как мы передем строку в массив строк.
Комментариев нет:
Отправить комментарий