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

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

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

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

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

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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)