Не распознаётся текст с пробелом

Рейтинг: 0Ответов: 1Опубликовано: 20.05.2023

Делаю приложение на Kotlin под Android и столкнулась с проблемой. Суть приложения - сканировать текст и находить вредные "Е"шки в отсканированном тексте. Когда я сканирую текст в виде: "Е123", то никаких проблем не возникает совсем. Но, если в тексте имеется пробел:"Е 123", то никаким образом не получается увидеть эту "ешку" как вредную и вывести ее на экран списком с остальными найденными вредными веществами.

Функция:

private fun processImage() {

    if(imageBitmap!=null){

        val image = imageBitmap?.let {
            InputImage.fromBitmap(it, 0)
        }

        image?.let { image ->
            recognizer.process(image)
                .addOnSuccessListener { result ->
                    if (result.text.isBlank()) {
                        binding.textView.text = "Текст не найден."
                    } else {
                        val recognizedWords = result.text.split("\\s+".toRegex()).map { word -> word.replace(",", "") }
                        val dangerWords = listOf("E121", "E 121", "E123", " E 123", " E 123 ", "E 123 ","E 123", "E128", "E 128", "E216", "E 216", "E217", "E 217", "E240", "E 240", "E294a", "E 294a", "E294 a", "E 294 a", "E294b", "E 294b", "E294 b", "E 294 b", "Hydroxyzine")
                        val foundDangerWords = recognizedWords.filter { word -> dangerWords.any { dangerWord -> word.trim().replace(" ", "").equals(dangerWord.replace(" ", ""), ignoreCase = true) } }
                        if (foundDangerWords.isNotEmpty()) {
                            binding.textView.text = "Найдены запрещенные вещества: \n" + foundDangerWords.joinToString("\n")
                        } else {
                            binding.textView.text = "Не найдены запрещенные вещества."
                        }
                    }
                }
        }
    }

    else{
        Toast.makeText(this, "Please, select image first", Toast.LENGTH_SHORT).show()
    }
} 

Текст без пробелов нормально сканирует и выводит вредное: все норм

Но если есть пробелы:

все плоха(

Подскажите, пожалуйста, возможно ли вообще с этим что либо сделать? Уже совсем нет сил, ничего не понимаю

Ответы

▲ 4Принят

Так происходит, потому что вы сначала разделаете слова пробелами, и слово E 123 разделается на два слова E и 123.

Попробуйте сначала разделять слова запятыми, а потом удалять пробелы.

Вот пример.

    public static List<String> findHazardousSubstances(String hs) {
        var dangerWords = List.of("E121", "E123", "E128", "E216", "E217", "E240", "E294a", "E294b", "Hydroxyzine");

        List<String> hazardWordsFormattedList =
                // сначала разделяем слова запятыми
                Arrays.stream(hs.split(","))
                        // потом удаляем пробелы
                        .map(word -> word.replaceAll("\\s+", ""))
                        // на всякий случай если будут дубликаты
                        .distinct()
                        // проверяем есть ли в списке вредных веществ
                        .filter(word -> dangerWords.contains(word))
                        .toList();
        
        return hazardWordsFormattedList;
    }