На собеседовании задали задачу: имеется клавиатура аналогового телефона от 0 до 9, где каждой цифре соответствуют три буквы, 1 - абв, 2 - где и т.д. Необходимо написать реализацию набора слов по следующему принципу: при вводе цифр выводятся в качестве подсказки три слова, начинаются на соответствующие буквы. При вводе 1 - три слова а-, б-, в-, при вводе 1,2 - три слова аг-, бд-, ве-, и т.д. Решить не смог, но до сих пор думаю на реализацией. Подскажите как это можно реализовать, например на java и какую структуру данных использовать. Напрашивается дерево, но не знаю как реализовать.
Допустим в базе хранятся имена абонентов, типа:
Каждой букве в имени сопоставляем число, в соответствии с наборной клавиатурой (диском), в итоге получим:
Остальное уже дело техники. При наборе цифры 4 - смотрим на массив цифр и понимаем, что с 4-ки начинается только Иванов.
Для начала на 10 кнопках расположить 33 буквы на каждой по 3 не получится, поэтому либо нужно 11 кнопок, либо на каких-то кнопках будет по 4 буквы. Поскольку 3 слова то легче первый вариант.
Например так
char[][] buttons = {
{'ъ','ы','ь'},
{'а','б','в'},
{'г','д','е'},
{'ё','ж','з'},
{'и','й','к'},
{'л','м','н'},
{'о','п','р'},
{'с','т','у'},
{'ф','х','ц'},
{'ч','ш','щ'},
{'э','ю','я'}
};
А дальше все просто, индекс слова это индекс символа во вложенном массиве, а индекс главного массива индекс кнопки. Последовательность набранных кнопок формирует три начала слова, а после этого например в базе ищутся по одному слову начинающиеся на каждое сочетание. Например последовательное нажатие клавиш: 5 1 выведет три сочетания начала слов: ла, мб, нв. Дальше формируется например запрос в БД (все зависит от того, где хранятся слова).
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// Индекс элемента массива words соответствует кнопке номеронабирателя телефона
String[] words = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
String[] lines = {"", "", "", ""};
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String r = "", t = "";
int n, m;
for (int k = 0; k < 7; k++) { // предполагается 7-значный телефонный номер
do {
System.out.println("Введите число (0..9):");
r = reader.readLine();
} while (r.length() == 0 || r.length() > 1 || (r.length() == 1 && (r.charAt(0) > '9' || r.charAt(0) < '0')));
n = Integer.parseInt(r);
if (k == 6)
r = "";
else
r = "-";
String s = words[n];
if (n > 1) {
for (int i = 0; i < s.length(); i++) {
lines[i] = lines[i].concat(String.format("%c", s.charAt(i)));
System.out.println(lines[i] + r);
}
if (lines[3].length() > 0 && s.length() == 3)
System.out.println(lines[3] + r);
}
else {
for (int i = 0; i < 3; i++) {
lines[i] = lines[i].concat(String.format("%d", n));
System.out.println(lines[i] + r);
}
if (lines[3].length() > 0) {
lines[3] = lines[3].concat(String.format("%d", n));
System.out.println(lines[3] + r);
}
}
}
}
}
В программе используется американский стандарт расположения букв латиницы на кнопках номеронабирателя телефонного аппарата. В СССР до 1968 года существовала практика наряду с цифрами использовать символы кириллицы на кнопочном номеронабирателе, но стандарта по их размещению не было принято. Кнопки "0" и "1" как в американском, так и в отечественном вариантах размещения оставались свободными от букв. Пример: 0-"", 1-"", 2-"абвг", 3-"дежз", 4-"ийкл", 5-"мноп", 6-"рсту", 7-"фхцч", 8-"шщъы", 9-"ьэюя".
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я разбираю старый проект и нашел интересную вещь, которую не понимаю
Необходимо получить сообщения из определенного чата Делаю запрос:
Получается, это дублирующие друг друга вещиМожет, есть какие-то реальные различия?
В общем есть один метод, который принимает два параметра, например метод