Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Поиск совпадений с помощью Hashset

13.02.2024, 10:51. Показов 1534. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            string str = "i have a friend whose name is... and we have fun together.";
            byte[] bytes = Encoding.ASCII.GetBytes(str);
 
            HashSet<byte[]> hs = new HashSet<byte[]>();
            int hsCount = 0;
            for (int i = 0; i < bytes.Length; i++) // проходим весь массив
            {
                for (int j = i; j >= 0 && ((bytes.Length - i) >= (i - j)); j--) // проходим от текущей позиции в массиве до начала массива
                {
                    byte[] jByte  = new byte[i - j + 1];
                    for (int jTemp = j; jTemp <= i; jTemp++) // формируем отдельные "слова" от позиции обратного хода, до текущей позиции в массиве
                    {
                        jByte[jTemp - j] = bytes[jTemp];
                    }
                    Console.WriteLine("|{0}| : {1}", Encoding.Default.GetString(jByte), jByte.Length);
                    if (Encoding.Default.GetString(jByte) == "have")
                        Console.WriteLine("######################");
                    if (hs.Contains(jByte)) hsCount++;
                    else hs.Add(jByte);
                    // if (!hs.Add(jByte)) hsCount++; //до Contains пользовался просто Add
                }
            }
            Console.WriteLine("hsCount = {0}", hsCount);
Протестировал совпадение на простой конструкции с одним словом, при добавлении слова, когда оно уже есть Add возвращает False, когда его нет, то True. Переделал в общую конструкцию с добавлением в Hashset и подсчётом совпадений в hsCount, в итоге hsCount сегда равен 0. Для тестирования вставил несколько команд с выводом на экран, например при совпадении со словом "have", совпадение есть, но Hashset на это не реагирует и добавляет его как новое слово.

Отсюда вопрос - где я тут исхожу из неверной предпосылки? Может перекодирование из строки в массив и обратно создаёт разные массивы, которые одинаковые только визуально?

Вывод выглядит вот так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|i| : 1
| | : 1
|i | : 2
|h| : 1
| h| : 2
|i h| : 3
|a| : 1
|ha| : 2
| ha| : 3
|i ha| : 4
|v| : 1
|av| : 2
|hav| : 3
| hav| : 4
|i hav| : 5
|e| : 1
|ve| : 2
|ave| : 3
|have| : 4
######################
| have| : 5
|i have| : 6
| | : 1
|e | : 2
|ve | : 3
|ave | : 4
|have | : 5
| have | : 6
|i have | : 7
...
|e| : 1
|ve| : 2
|ave| : 3
|have| : 4
######################
| have| : 5
|e have| : 6
...
|r| : 1
|er| : 2
|her| : 3
|.| : 1
|r.| : 2
hsCount = 0
и т.д. Видно как была реакция на "have" и такая же реакция позже еще раз, но hsCount равен 0.
Ну и понятно что одинаковых одиночных букв помимо слова "have" там хватает, то есть hsCount должен быть больше нуля.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2024, 10:51
Ответы с готовыми решениями:

Поиск совпадений и действия в зависимости от наличия совпадений
Попытаюсь вкратце описать суть. Приходит список позиций с ценами. Необходимо проверить артикул на наличие совпадений с базой и 1) Если...

Обсуждение HashSet, в частности- хранит HashSet объекты отсортированными или нет?
Что-то я не могу понять. Смотрите, мне надо запихать 10000 случайных элементов типа Integer в порядке их генерирования в HashSet, а потом...

Поиск строки в HashSet и в массиве
Заполните массив и HashSet случайными строками, не менее 10 000 строк. Строки можно сгенерировать. Потом выполните замер производительности...

27
HF
 Аватар для HF
1341 / 925 / 202
Регистрация: 09.09.2011
Сообщений: 2,750
Записей в блоге: 2
13.02.2024, 21:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Спорное решение.
Я ж написал - что это быстрое однострочное решение чтобы просто заработало. Конечно же я даже не стал акцентировать внимания на что что.... существуют ещё и кодировки и это важно при работе с байт массивами.
ASCII или UTF8... он бы как только начал с файлами работать, то это бы всё сломалось в одночасье.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18396 / 14327 / 5370
Регистрация: 17.03.2014
Сообщений: 29,002
Записей в блоге: 1
13.02.2024, 21:18
HF, мы поняли друг друга
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
14.02.2024, 05:56  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Если это "портянки", то что что будет если расписать вообще все возможные ситуации и проблемы
Документация. И тут важно не просто расписать, а явно указать на нюансы.

Цитата Сообщение от HF Посмотреть сообщение
Насчёт описания - там тоже всё есть
Вы дали описание Contains, а не Hashset, чтобы понимать что вам понадобится читать Contains уже нужно обладать определенной информацией. Но даже в описании Contains я не вижу указания на то, что при работе с массивами поведение будет отличаться.

Цитата Сообщение от HF Посмотреть сообщение
Далее идут ссылки: что коллекция реализует Contains. А мы же его и используем? Идём сначала во второй
Почему мы знаем что мы его используем? Мне вот это совершенно не очевидно. И почему сначала во второй?

Цитата Сообщение от HF Посмотреть сообщение
всё скучно, но уже есть кое что полезное про то что ищем объекты, а не значения
Мне это ничего не скажет, насколько я знаю базовые типы в C# реализованы через объекты.

Цитата Сообщение от HF Посмотреть сообщение
Не даёт прямой ответ, но уже даёт намёк на то что не всё так просто
там написано что в Hashset и Dictionary есть различия и не более того.

Цитата Сообщение от HF Посмотреть сообщение
И я бы ещё снова акцентировал внимание, что belalugoci не понимает эффект применения new. Так как после этого Contains вообще бессмысленен и даже без отладки можно сказать что он даст ответ "не найдено".
Поясните, я не понимаю о чем вы говорите.

Цитата Сообщение от HF Посмотреть сообщение
Если бы сразу понял, то сделал бы самое простой быстрое решение, причём из своего же кода это и следовало
Цитата Сообщение от HF Посмотреть сообщение
if(hs.Any(x => Encoding.Default.GetString(x) == Encoding.Default.GetString(jByte)))
Я вообще не представляю что это за конструкция.

Цитата Сообщение от HF Посмотреть сообщение
Проблема решается Одной строкой.
Мне кажется у вас профдеформация, вы не в состоянии опуститься в своем понимании окружающего ниже определенного порога и вам трудно понимать других, вы же родились с томиком Страуструпа и наколками с полным MSDN.

Цитата Сообщение от HF Посмотреть сообщение
он бы как только начал с файлами работать, то это бы всё сломалось в одночасье
Это лишь говорит о вашем отношении к людям, особенно когда вы находитесь в разделе для новичков.
И я с фалами байтовыми работаю давно, читаю их всегда в ASCII, другие кодировки мне неинтересны.
0
Эксперт .NET
 Аватар для Usaga
14768 / 9541 / 1365
Регистрация: 21.01.2016
Сообщений: 35,980
14.02.2024, 07:14
Цитата Сообщение от belalugoci Посмотреть сообщение
а не вычисляя хеш сделала эту функцию нерабочей для массивов как таковых.
Это не так. Просто дефолтное поведение - сравнение экземпляров массивов, а не их содержимого. Всё тут рабочее. И это поведение согласуется с 99% поведением всех классов в .NET, для которых GetHashCode не переопределен...

Другое дело, что твоё ожидание расходится с тем, как это видят разработчики в .NET. Я не понимаю, почему тут в документации что-то как-то выделять должны были? Такое поведение в любом учебнике расписано.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
14.02.2024, 07:45  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Просто дефолтное поведение - сравнение экземпляров массивов
в Си присваивание data1 = data2 манипулирует указателем на адрес в памяти и если указатели совпадают, то и данные совпадают, вы хотите сказать что здесь такой же смысл?

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Такое поведение в любом учебнике расписано
опять возвращаемся к примеру с рисованием совы.
0
Эксперт .NET
 Аватар для Usaga
14768 / 9541 / 1365
Регистрация: 21.01.2016
Сообщений: 35,980
14.02.2024, 07:54
Цитата Сообщение от belalugoci Посмотреть сообщение
вы хотите сказать что здесь такой же смысл?
Да

Цитата Сообщение от belalugoci Посмотреть сообщение
опять возвращаемся к примеру с рисованием совы.
Это к вопросу о логичности решения разработчиков и почему не упомянули в документации на HashSet. Всё было явно упомянуто, но не там, где ты смотрел)
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
14.02.2024, 08:23  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Да
а в чем сложности у объясняющих так сказать сразу? ) А то "сравнение экземпляров массивов", звучит как "транслюцентная гиперфазодинамия" и куда мудрёнее чем "сравнение указателей".

PS: дигидрогена монооксид
0
Эксперт .NET
 Аватар для Usaga
14768 / 9541 / 1365
Регистрация: 21.01.2016
Сообщений: 35,980
14.02.2024, 08:27
belalugoci, там не совсем указатели сравниваются. Сначала хеши, а потом указатели (двойное сравнение - особенность хеш-таблиц). А хеши они не совсем производные от указателей. Как оно считается где-то писалось, но я забыл детали за ненадобностью.

Если тебе проще, то можно считать, что указатели сравниваются. Внешне результат такой же будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2024, 08:27

HashSet. Удалить объект-класс из HashSet
Всем привет! Есть код: HashSet&lt;Human&gt; humanHashSet = new HashSet(); humanHashSet.add(new...

Поиск слова в HashSet. Нужна помщь.
У меня есть коллекция слов, хранимая в HashSet. - некий словарь. Пусть у меня есть слово, типа String &quot;чтение&quot;. Мне нужно узнать...

HashSet<string> Работа с элементами листа - поиск дублей
Всем привет. Как дошел до этой проблемы, думал справлюсь за пару минут. Но нет. Что-то пошло не так... HashSet&lt;string&gt; Работа с...

Как на JS с помощью объекта regexp получить массив всех совпадений?
Как на JS с помощью объекта regexp получить массив всех совпадений? var myregexp = /&lt;item*&gt;(.*?)&lt;/item&gt;/ig; var xmlData =...

Поиск совпадений
Здравствуйте. Ищу плагин для wordpress (ибо кодить не умею, но если скажете, что и куда писать, буду вам невероятно благодарен), который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru