Подсчет количества различных символов кирилицы

1. Михаська 12 22.04.21 14:40 Сейчас в теме
Простая функция, на вход принимающая строку, а на выходе отдающая число - количество различных русских символов, встречающихся в строке. Может кому пригодится.

Функция ПосчитатьКоличествоРазличныхСимволовКириллицы(Знач СтрокаПарсинга) Экспорт
	//Функция возвращает число - количество различных символов кириллицы в строке. Минимальное значение = 0.	
	
	МассивНайденныхРазличныхСимволов = Новый Массив;
	
	СтрокаПарсинга 		= СокрЛП(СтрокаПарсинга);
	СтрокаПарсинга 		= нрег(СтрокаПарсинга);
	ДлинаСтрокиПарсинга = СтрДлина(СтрокаПарсинга);
	
	Если ДлинаСтрокиПарсинга > 0 Тогда
		
		СимволыКирилицы = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
		
		Для а = 1 по ДлинаСтрокиПарсинга Цикл
			
			ТекущийСимволСтроки = Сред(СтрокаПарсинга,а,1);
			
			Если  МассивНайденныхРазличныхСимволов.Найти(ТекущийСимволСтроки) = Неопределено 
				и СтрНайти("абвгдеёжзийклмнопрстуфхцчшщъыьэюя",ТекущийСимволСтроки) > 0 Тогда
				
				МассивНайденныхРазличныхСимволов.Добавить(ТекущийСимволСтроки);
				
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЕсли;
	
	Возврат МассивНайденныхРазличныхСимволов.Количество(); //Количество различных символов кириллицы, найденных в строке
	
КонецФункции
Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 22.04.21 14:50 Сейчас в теме
(1)
Если МассивНайденныхРазличныхСимволов.Найти(ТекущийСимволСтроки) = Неопределено
и СтрНайти("абвгдеёжзиклмнопрстуфхцчшщъыьэюя",ТекущийСимволСтроки) > 0 Тогда

МассивНайденныхРазличныхСимволов.Добавить(ТекущийСимволСтроки);

КонецЕсли;
Такое через Соответствие делается. Метод массива Найти довольно затратный.
3. DenisVol 2 22.04.21 15:04 Сейчас в теме
4. dhurricane 22.04.21 15:08 Сейчас в теме
"й" забыли. :-)
Михаська; +1 Ответить
20. Михаська 12 28.06.21 16:05 Сейчас в теме
5. karamazoff 112 22.04.21 15:47 Сейчас в теме
а не проще ли символы, если кириллица добавлять к новой строке, проверяя что там таких нет, а потом посчитать длину строки? проверку на кириллицу тоже можно делать не поиском в строке шаблоне а по коду символа - больше такого и меньше сякого
6. МихаилМ 22.04.21 15:54 Сейчас в теме
просто удалите символы их текста и сравните длину до и после. проверял на 1 томе "война и мир". работает в 100 раз предложенного алгоритма.
7. karamazoff 112 22.04.21 15:58 Сейчас в теме
(6)а как при этом дублирующие отсеятся? будет там десять "а", как про это узнать?

Кстати еще рабочий вариант - создаем тз с одной колонкой, суем туда всю кириллицу, потом сворачиваем и считаем кол-во строк.
8. МихаилМ 22.04.21 15:59 Сейчас в теме
9. karamazoff 112 22.04.21 16:13 Сейчас в теме
(8)там код не понятен, приведите его здесь, будет что обсудить! Интересно!
10. Sashares 35 22.04.21 16:42 Сейчас в теме
(8)Идея интересная, но не понятен смысл, зачем сравнивать длину до и после?
Можно пойти от обратного - задать в коллекции все символы кириллицы, и обходить эту коллекцию.
И для каждого символа - искать в исходной строке.
Если символ в строке есть, то к счетчику добавлять 1.
11. karamazoff 112 22.04.21 16:46 Сейчас в теме
(10)в том и вопрос, алгоритм не для этой задачи, в томе войне и мира количество РАЗЛИЧНЫХ символов будет равно длине алфавита...
Михаська; +1 Ответить
12. independ 1541 22.04.21 17:21 Сейчас в теме
СимволыКирилицы = "абвгдеёжзиклмнопрстуфхцчшщъыьэюя";
СимволыКирилицы=СимволыКирилицы+ВРЕГ(СимволыКирилицы);
МассивСтрокНеКириллицы=СтрРазделить(СтрокаПарсинга,СимволыКирилицы,Истина);
СтрокиНеКириллицы=СтрСоединить(МассивСтрокНеКириллицы);
МассивСтрокКириллицы=СтрРазделить(СтрокаПарсинга,СтрокиНеКириллицы,Ложь);
СтрокаКириллицы=СтрСоединить(МассивСтрокКириллицы);
Сообщить(СтрДлина(СтрокаКириллицы));
13. Sashares 35 22.04.21 17:34 Сейчас в теме
(12) Количество уникальных символов считаем. А у вас общее количество символов кириллицы.
Михаська; +1 Ответить
14. independ 1541 22.04.21 17:35 Сейчас в теме
(13) верно, не заметил про уникальность, тогда через соответствие
Соот=Новый Соответствие;
Для сч=1 по СтрДлина(СтрокаПарсинга) Цикл
	СимвКир=Сред(СтрокаПарсинга,сч,1);
	Если СтрНайти(СимволыКирилицы,СимвКир)>0 Тогда
		Соот.Вставить(СимвКир,СимвКир);
	КонецЕсли;
КонецЦикла;
Сообщить(Соот.Количество());
15. karamazoff 112 22.04.21 19:10 Сейчас в теме
(14) а это быстрее таблицы и массива? почему все-же не строка? Да, в ней придется добавить еще строчку кода, на проверку символа, что он там уже есть, но вот... что быстрее?
16. independ 1541 22.04.21 19:14 Сейчас в теме
(15) можно строку с символами кириллицы перевести в соответствие, тогда будет получше
можно еще использовать регулярные выражения, но я в них не силен
karamazoff; +1 Ответить
17. karamazoff 112 22.04.21 19:22 Сейчас в теме
(16)скорее всего вы правы, но запихать все символы кириллицы к колонку тз и свернуть ее, я бы попробовал, там никаких сравнений, на уровне цикла, не происходит
18. independ 1541 22.04.21 19:44 Сейчас в теме
(17) можно сделать гибрид из вариантов (12) и (14)
СимволыКирилицы = "абвгдеёжзиклмнопрстуфхцчшщъыьэюя";
СимволыКирилицы=СимволыКирилицы+ВРЕГ(СимволыКирилицы);
МассивСтрокНеКириллицы=СтрРазделить(СтрокаПарсинга,СимволыКирилицы,Истина);
СтрокиНеКириллицы=СтрСоединить(МассивСтрокНеКириллицы);
МассивСтрокКириллицы=СтрРазделить(СтрокаПарсинга,СтрокиНеКириллицы,Ложь);
СтрокаКириллицы=СтрСоединить(МассивСтрокКириллицы);
Соот=Новый Соответствие;
Для сч=1 по СтрДлина(СтрокаКириллицы) Цикл
    СимвКир=Сред(СтрокаКириллицы,сч,1);
        Соот.Вставить(СимвКир,СимвКир);
КонецЦикла;
Сообщить(Соот.Количество()); 
Показать
19. karamazoff 112 22.04.21 20:19 Сейчас в теме
(18)ваше решение красивое, другие то-же работают, здесь ведь соревнуемся алгоритмами? А 1С все-таки больше язык управления для БД, а не для чистых нейронов ;) тут еще вопрос, что от платформы к платформе результаты по скорости разных решений могут меняться, а платформы, последнее время, выходят как горячие пирожки.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот