Андроид-приложение, 57-я неделя
Поиск: лексический, побуквенный
Поисков у меня в приложении пока будет два: лексический (lexical) и побуквенный (literal). Лексический поиск находит подходящую под запрос пользователя лексему и выдаёт результаты согласно сопоставленной лексеме. А побуквенный — ищет словоформу, в точности соответствующую запросу.
В порядке эксперимента я реализую побуквенный поиск для английского и корнуэльского языка, а лексический — для русского, чувашского и корейского.
Вот закодированный лексический индекс:
package com.example.myapp.searchlex val lexMetaindex = mapOf( "1062927765857732217775917700" to listOf("2024-04-25-e1"), // "띄어쓰기" "1051837775917700" to listOf("2024-04-25-e2"), // "보기" "7561539594" to listOf("2024-04-25-e2"), // "бланк" "755461945495729441211182" to listOf("2024-04-10-e1"), // "болконский ф" "75516231" to listOf("2024-04-10-e1"), // "быть" "76" to listOf("2024-04-25-e1"), // "в" "764272318553" to listOf("2024-04-10-e1"), // "весьма" "65429531" to listOf("2024-04-23-e1"), // "день" "655475645121" to listOf("2024-04-23-e1"), // "добрый" "71537454619542954142" to listOf("2024-04-25-e2"), // "заполнение" "41" to listOf("2024-04-10-e1"), // "и" "9495637131" to listOf("2024-04-10-e1"), // "князь" "945464422172944121" to listOf("2024-04-25-e1"), // "корейский" "9464537241765121" to listOf("2024-04-10-e1"), // "красивый" "948495" to listOf("2024-04-23-e1"), // "кун" "85546154655421" to listOf("2024-04-10-e1"), // "молодой" "955354758485" to listOf("2024-04-25-e3"), // "наобум" "954275546131835421" to listOf("2024-04-10-e1"), // "небольшой" "54" to listOf("2024-04-23-e2"), // "о" "54756453714293" to listOf("2024-04-25-e2"), // "образец" "5474644265426132955121" to listOf("2024-04-10-e1"), // "определённый" "744172318554" to listOf("2024-04-25-e1"), // "письмо" "74546463655494" to listOf("2024-04-25-e1"), // "порядок" "74547262539554769453" to listOf("2024-04-25-e1"), // "постановка" "746454754261" to listOf("2024-04-25-e1"), // "пробел" "645372848165536231" to listOf("2024-04-23-e2"), // "рассуждать" "64547262" to listOf("2024-04-10-e1"), // "рост" "72" to listOf("2024-04-10-e1"), // "с" "7284965421" to listOf("2024-04-10-e1"), // "сухой" "92426154764294" to listOf("2024-04-10-e1"), // "человек" "9242646253" to listOf("2024-04-10-e1"), // "черта" "92625461417554" to listOf("2024-04-23-e2"), // "что-либо" "516452" to listOf("2024-04-23-e1"), // "ырӑ" )
Видно, что в индекс записано тридцать три лексемы — следовательно, для них можно создать тридцать три различных результата лексического поиска (то есть поиск проводится по тридцати трём лексемам; запрос всегда либо «попадает» только «по одной лексеме», либо «не попадает» вообще).
Правда, на текущий момент у меня в приложении не так много примеров, чтобы искать по ним...
Повторение пройденного
Мне предстоит добавить в своё приложение совершенно не знакомый мне функционал, поэтому я пересматриваю ролики ютуб-канала «Разработчики „Андроида“».
Смущает то, что код может быть неясным для новичков. Вот пример (учитывайте то, что угловые скобки заменены прямыми скобками):
@Composable fun MessageList(messages: List[String]) { Column { var selectAll: Boolean = ... Checkbox( checked = selectAll, onCheckChange = { checked -> selectAll = checked } ) ... } }
Параметр «чекд» (checked) функции «Чекбокс» (Checkbox) и одноимённый параметр лямбды лучше бы назывались по-разному:
@Composable fun MessageList(messages: List[String]) { Column { var selectAll: Boolean = ... Checkbox( checked = selectAll, onCheckChange = { checkedAsLambdaParameter -> selectAll = checkedAsLambdaParameter } ) ... } }
Проблему мог бы решить язык котлин, введи он в свой синтаксис что-то вроде артиклей:
@Composable fun MessageList(messages: List[String]) { Column { var selectAll: Boolean = ... Checkbox( checked = selectAll, onCheckChange = { #checked -> selectAll = #checked } ) ... } }
Вуаля! Теперь вы не спутаете одно с другим...
А фраза «он чек чейндж» (onCheckChange) может быть непривычна неносителям английского языка. Но это уже́ проблема неносителей... «После проверки изменения»? — нет, конечно: «после изменения статуса выбора»! Хорошо бы решить это другим синтаксисом:
checked = selectAll, onChange["checked"] = { #checked -> selectAll = #checked }
Тут именно прямые скобки: в словарь «он чейндж» (onChange) по ключу «чекд» (checked) записывается лямбда (колбек).
Вычисление размера компонента графического интерфейса
В том же самом ролике, ссылку на который я давал выше, рассказывается о важном преимуществе фреймворка «Компоус», которое проявляется при вычислении размера компонента графического интерфейса.
Когда использовать «реме́мбер сэ́йвэбэл», а когда — просто «реме́мбер»
Если значение какой-либо величины не должно пересчитываться при смене конфигурации (должно «пережить» смену конфигурации), то, возможно, следует использовать «реме́мбер сэ́йвэбэл», а не просто «реме́мбер».
Суть компоусэблов за 10 минут
Компоусэблы, рекомпозиция и всё, что я описывал ранее в своих постах, в том числе в отдельной «шпаргалке», объяснено в десятиминутном ролике.
Перерыв
Я вынужден прервать разработку на неопределённый срок.