Задача:
Реализовать функцию автодополнения следующим образом: по началу слова
необходимо выдавать список из 10 наиболее часто встречающихся слов,
начинающихся с указанного префикса. Сортировать варианты автодополнения в
порядке убывания частоты использования. В случае равенства частот - варианты
сортируются естественным образом (по алфавиту). Если вариантов меньше 10, то
выдавать столько, сколько нашли.
I часть
Решение должно быть в виде консольного java-приложения. Исходные данные
подаются через стандартный поток ввода, а все результаты выводятся в
стандартный поток вывода.
Исходные данные:
В первой строке находится единственное число
N (1 ≤ N ≤ 10^5)
- количество словв словаре. Каждая из следующих N строк содержит слово wi (непустая
последовательность строчных латинских букв длиной не более 15) и целое число
ni (1 ≤ ni ≤ 10^6)
- частота употребления слова wi. Слово и число разделеныединственным пробелом. Ни одно слово не повторяется более одного раза. В
(N+2)-й строке находится число M (
1 ≤ M ≤ 15000)
. В следующих M строкахсодержатся слова uj (непустая последовательность строчных латинских букв
длиной не более 15) - начала слов, введённых пользователем.
Результат:
Для каждой из M строк необходимо вывести наиболее употребляемые слова,
начинающиеся с uj. Варианты дополнения для каждого слова необходимо
разделять переводами строк.
Пример:
stdin
5
kare 10
kanojo 20
karetachi 10
korosu 7
sakura 3
3
k
ka
kar
stdout
kanojo
kare
korosu
karetachi
kanojo
kare
karetachi
kare
karetachi
II часть
Решение должно быть в виде web-приложения с использованием [Spring MVC]
(http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html) и
[AngularJS] (https://angularjs.org/). Запускать приложение на [Apache Tomcat]
(http://tomcat.apache.org/). Исходные данные подаются через файл.
Исходные данные:
В первой строке находится единственное число N
(1 ≤ N ≤ 10^5)
- количество словв словаре. Каждая из следующих N строк содержит слово wi (непустая
последовательность строчных латинских букв длиной не более 15) и целое число
ni
(1 ≤ ni ≤ 10^6)
- частота употребления слова wi. Слово и число разделеныединственным пробелом. Ни одно слово не повторяется более одного раза.
Результат:
На главной странице web-приложения должна быть единственная строка с
вводом. Ввод символов в строку должен сопровождаться выдачей вариантов
автодополнения.
Дополнительные требования:
- Использование [maven] (https://maven.apache.org/) приветствуется (либо
требуется иной скрипт для сборки)
- Код на Java в стиле, соответствующем
рекомендациям http://google.github.io/styleguide/javaguide.html
- Приоритет на скорость работы (решение должно отрабатывать не дольше
1-10 секунд на тестовом файле [test.in]
(https://github.com/dmitryanufriev/kontest/blob/master/test.in))
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Задача:
Нужно сделать HTTP сервис для сокращения URL наподобие Bitly и других сервисов.
UI не нужен, достаточно сделать JSON API сервис.
Должна быть возможность:
- сохранить короткое представление заданного URL
- перейти по сохраненному ранее короткому представлению и получить redirect на соответствующий исходный URL
Требования:
-Язык программирования: Java
- Предоставить инструкцию по запуску приложения. В идеале (но не обязательно) – использовать контейнеризацию с возможностью запустить проект командой docker-compose up
- Требований к используемым технологиям нет - можно использовать любую БД для персистентности
- Код нужно выложить на github (просьба не делать форк этого репозитория, чтобы не плодить плагиат)
Усложнения:
- Написаны тесты (постарайтесь достичь покрытия в 70% и больше)
- Добавлена валидация URL с проверкой корректности ссылки
- Добавлена возможность задавать кастомные ссылки, чтобы пользователь мог сделать их человекочитаемыми - http://bit.ly/avito-auto-be
- Проведено нагрузочное тестирование с целью понять, какую нагрузку на чтение может выдержать наш сервис
- Если вдруг будет желание, можно слепить простой UI и выложить сервис на бесплатный хостинг - Google Cloud, AWS и подобные.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Структурированный список ресурсов для изучения Java, который поможет систематизировать занятия. Основан на личном опыте и самостоятельном изучении данной области.
Ставьте ❤️ и отправляйте друзьям
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Напишите метод, который получает на вход Map<K, V> и возвращает Map, где ключи и значения поменяны местами. Так как значения могут совпадать, то тип значения в Map будет уже не K, а
Collection<K>:
Map<V, Collection<K>>
Решение:
public static <K, V> Map<V, Collection<K>> inverse(Map<K, V> map){
Map<V, Collection<K>> resultMap = new HashMap<>();
Set<K> keys = map.keySet();
for(K key : keys){
V value = map.get(key);
resultMap.compute(value, (v, ks) -> {
if(ks == null){
ks = new HashSet<>();
}
ks.add(key);
return ks;
});
}
return resultMap;
}
✔️ Пишите свой вариант в комментариях
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Постройте глубокую копию списка. Глубокая копия должна состоять ровно из n совершенно новых узлов, где каждый новый узел имеет значение равное значению соответствующего ему исходного узла. Оба – следующий и случайный указатель новых узлов – должны указывать на новые узлы в скопированном списке таким образом чтобы указатели и в исходном, и в скопированном списке представляли одно и то же состояние списка. Ни один из указателей в новом списке не должен указывать на узлы в исходном списке.
К примеру, если в исходном списке есть два узла X и Y, где X.random –> Y, то для соответствующих двух узлов x и y в скопированном списке, x.random –> y.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Парсер SQL запросов
В SQL самым синтаксически сложным и навороченным является, пожалуй, запрос SELECT. Явные и неявные объединения, группировки, подзапросы, сортировки и усечения выборки – вся эта красота может встречаться неоднократно даже в одном единственном select-запросе.
Например, так:
SELECT * FROM book
или так:
SELECT author.name, count(book.id), sum(book.cost)
FROM author
LEFT JOIN book ON (author.id = book.author_id)
GROUP BY author.name
HAVING COUNT(*) > 1 AND SUM(book.cost) > 500
LIMIT 10;
Напишите, пожалуйста, парсер произвольного SELECT-запроса, представляющего его в виде класса примерно такого структуры:
class Query {
private List<String> columns;
private List<Source> fromSources;
private List<Join> joins;
private List<WhereClause> whereClauses;
private List<String> groupByColumns;
private List<Sort> sortColumns;
private Integer limit;
private Integer offset;
}
Структура этого класса не догма, а руководство к действию 🙂 Если вы придумали класс, лучше отражающий структуру SQL-запроса чем приведено здесь – смело используйте свое решение.
Какие конструкции парсер должен поддерживать в обязательном порядке:
- Перечисление полей выборки явно (с алиасами) или *
- Неявное объединение нескольких таблиц (select * from A,B,C)
- Явное объединение таблиц (inner, left, right, full join)
- Фильтрующие условия (where a = 1 and b > 100)
- Подзапросы (select * from (select * from A) a_alias)
- Группировка по одному или нескольким полям (group by)
- Сортировка по одному или нескольким полям (order by)
- Усечение выборки (limit, offset)
На что можно не обращать внимание:
Дополнение выборок (union и union all)
CTE
Window-функции
Немного деталей:
- Выполнять работу необходимо на Kotlin или Java.
- В задании должен быть рабочий метод main(), это должно быть готовое приложение, а не просто библиотека
- По всем вопросам смело писать на [email protected]
- Сделанное задание необходимо разместить на GitHub
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Мы начинаем рубрику решения практических задач на Java с Codewars. Пишите ваши варианты решений в комментариях к посту.
1 Уровень Junior
В маленьком городке население р0 = 1000 в начале года. Население регулярно увеличивается на 2 процента в год, и более 50 новых жителей ежегодно переезжают в город. Сколько лет нужно городу, чтобы его население стало больше или равно p = 1200 жителей?
В конце первого года будет:
1000 + 1000 * 0,02 + 50 => 1070 жителей
В конце 2-го года будет:
1070 + 1070 * 0,02 + 50 => 1141 жителей (** количество жителей — целое число **)
В конце 3-го года будет:
1141 + 1141 * 0,02 + 50 => 1213
На это потребуется целых 3 года.
Более общие параметры:
p0, процент, aug (жители приезжащие или уезжающие каждый год), p (население)
функция nb_year должна возвращать n полных лет, необходимых для получения населения, большего или равного p.
aug — целое число, процент — положительное число, p0 и p — положительные целые числа (> 0)
Пример
nb_year(1500, 5, 100, 5000) -> 15
nb_year(1500000, 2.5, 10000, 2000000) -> 10
Примечание:
Не забудьте преобразовать результаты процент в вашей функции: если выводравен 2, вы должны преобразовать его в 0,02.
Ответ:
public class GrowthOfAPopulation {
public static int nbYear(int p0, double percent, int aug, int p) {
int years = 0;
int inhabitants = p0;
while(inhabitants < p)
{
inhabitants = (int)(inhabitants + (inhabitants * (float)(percent/100)) + aug);
years++;
}
return years;
}
}
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Если вы только начинаете изучать Java и уже имеете опыт программирования на С, то можете заметить разницу между этими двумя языками. К примеру, String — это объект в Java, а не массив символов с конечным NULL. Аналогично, в Java нет оператора sizeof(). Все примитивы имеют заранее определенный размер, например int — 4 байта, char — 2 байта, short — 2 байта, long и float — 8 байт и так далее.
Но если вам не хватает этого оператора, то почему бы не превратить это в вызов для себя как программиста? Если вы согласны с этим, то ваша следующая задача — написать метод на Java, который ведет себя как оператор/функция sizeOf() в C и возвращает размер в байтах для каждого числового примитивного типа, т.е. для всех примитивных типов, кроме Boolean.
Многие из вас, наверное, подумают: почему мы не включаем логическое значение? Разве ему не нужен всего 1 бит для представления истинных и ложных значений? Я не включаю Boolean в это упражнение, потому что размер Boolean строго не определен в спецификации Java и варьируется в зависимости от разных JVM.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Полезные библиотеки Java
Conductor — это платформа, созданная Netflix для организации процессов в микросервисах.
🖥 Github
📂 Документация
@javatg
Conductor — это платформа, созданная Netflix для организации процессов в микросервисах.
📂 Документация
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Приветствую всех! Если вы являетесь Java-разработчиком и задаетесь вопросом о том, что почитать в 2023 году, то вы обратились по адресу. В этой статье я собираюсь поделиться 21 книгой по Java, Spring и связанными с ними технологиями, которые стоит прочитать всем Java-разработчикам.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Ваша задача — эмулировать выравнивание текста в моноширинном шрифте. Вам будет предоставлен однострочный текст и ожидаемая ширина выравнивания. Самое длинное слово никогда не должно быть больше этой ширины.
Вот правила:
* Каждая строка должна содержать как можно больше слов.
* Используйте '\n' для разделения строк.
* Расстояние между словами не может отличаться более чем на один пробел.
* Используйте пробелы, чтобы заполнить разделение между словами.
* Строки должны заканчиваться словом, а не пробелом.
* '\n' не включается в длину строки.
* Сначала идут большие пробелы, затем меньшие ("Lorem--ipsum--dolor--sit-amet" (2, 2, 2, 1 пробел)).
* Последняя строка не должна быть выравнена по ширине, используйте только один пробел между словами.
* Последняя строка не должна содержать '\n'
* В строках с одним словом пробелы не нужны ('somelongword\n').
Текст на тест
public class TextJustificatory {
public static String justify(String text, int width) {
final String[] source = text.split(" ");
StringBuilder result = new StringBuilder();
StringBuilder string = new StringBuilder();
for (String word : source) {
if (word.length() + string.length() + 1 > width) {
result.append(
addJustified(string, width)
)
.append("\n");
string
.delete(0, string.length());
}
if (string.length() != 0) string.append(" ");
string.append(word);
}
result.append(
string
);
return result.toString();
}
private static String addJustified(StringBuilder raw, int width) {
final String[] words = raw.toString().split(" ");
if (words.length == 0) return "";
if (words.length == 1) return words[0];
final int freeSpaces = width - raw.length();
final int additionalSpacesPerWord = freeSpaces / (words.length - 1);
final int additionalSpacesForFirstWords = freeSpaces % (words.length - 1);
StringBuilder result = new StringBuilder(words[0]);
for (int i = 1; i < words.length; i++) {
result.append(" ");
if (i <= additionalSpacesForFirstWords) result.append(" ");
for (int i1 = 0; i1 < additionalSpacesPerWord; i1++) {
result.append(" ");
}
if (i != words.length - 1) result.append(words[i]);
}
result.append(words[words.length - 1]);
return result.toString();
}
}
Пишите ваши варианты решений в комментариях 👇
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Отличный бесплатный курс для Java программистов от Duke University.
Эта специализация, ориентированная на проекты, поможет вам создать расширить свое портфолио работ, чтобы продемонстрировать навыки программирования на Java. В завершающем этапе вы создадите рекомендательный механизм, аналогичный тем, которые используются в Netflix или Amazon.
▪ Курс
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 15 советов, которые ускорят работу вашего Java-приложения
Ускоряем ваш код, написанный на Java за 15 простых шагов. Советы, которые реально помогут на практике.
✔️ Читать дальше
@javatg
Ускоряем ваш код, написанный на Java за 15 простых шагов. Советы, которые реально помогут на практике.
✔️ Читать дальше
@javatg
Более 100 копий и альтернатив популярных сайтов с открытым исходным кодом, таких как Airbnb, Amazon, Instagram, Netflix, TikTok, Spotify, WhatsApp, YouTube и т. д. Настоящий кладез проектов для веб-разработчика. Список содержит исходный код, учебные пособия, демонстрационные ссылки, технический стек. Многие из проектов реализованы на Java.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
В этом руководстве мы начнем работу с Docker. Для этого создали Spring проект с одной конечной точкой REST и соберем для него образ Docker. Запустим образ Docker внутри контейнера и протестируем конечную APi внутри этого образа.
✔️ Примеры работы с Docker
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Полезные библиотеки Java
Codename One — это первая открытая мобильная кроссплатформенная среда для разработчиков Java и Kotlin, которая может компилировать байт-код Java в исполняемые файлы ОС (iOS, Android, UWP и т. д.). Это полноценная мобильная платформа с виртуальными машинами, симулятором, инструментами дизайна (визуальная тема/конструктор/CSS), интеграциями с IDE, портами для нескольких ОС и многим другим.
🖥 Github
@javatg
Codename One — это первая открытая мобильная кроссплатформенная среда для разработчиков Java и Kotlin, которая может компилировать байт-код Java в исполняемые файлы ОС (iOS, Android, UWP и т. д.). Это полноценная мобильная платформа с виртуальными машинами, симулятором, инструментами дизайна (визуальная тема/конструктор/CSS), интеграциями с IDE, портами для нескольких ОС и многим другим.
git clone https://github.com/codenameone/CodenameOne
cd CodenameOne/maven
mvn install
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM