Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) ИндекированнаяТаблица. Нечеткий поиск строки. (число прочтений - 20316 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИндекированнаяТаблица. Нечеткий поиск строки.
Ответ #15 - 28. Июня 2006 :: 19:59
Печать  
kms писал(а) 28. Июня 2006 :: 08:56:
Без проблем.

Схематично:
  • строишь индекс по колонке
  • ставишь фильтр от "BC  " до "BCЯЯ"
  • обрабатываешь выборку


  • Че непонятно-то? Если конкретный вопрос - постараюсь ответить.
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


    я хочу, чтоб сюда проложили
    дорогу оттуда...

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #16 - 28. Июня 2006 :: 20:02
    Печать  
    Или код нужен?

    Ну как-то так:
    Код
    Выбрать все
    _т.ДобавитьИндекс("Н", "Наименование");
    _т.УстановитьФильтр("Пе0000000000", "ПеЯЯЯЯЯЯЯЯЯЯЯЯ", "Н", 0, 0);
    _т.ВыбратьСтроки("Н");
    Пока _т.ПолучитьСтроку("Н") =1 Цикл
       Сообщить(_т.Наименование);
    КонецЦикла;
     
    
    

    Как-то так.
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    vip
    1c++ power user
    Отсутствует



    Сообщений: 1570
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #17 - 28. Июня 2006 :: 20:07
    Печать  
    Повторю основную задачу.
    Цитата:
    Нет, задача не такая. Надо механизм, как штатный быстрый поиск в списке по первым наименованиям.
    Использую для быстрого поиска в справочниках при применении ИспользоватьСписокЭлементов (штатный поиск при этом не работает).
    Перехватываю нажатия клавиш и анализирую переданный список. Пока только перебором.
    Если список небольшой, то все нормально.
    Хочу одновременно со списком создавать ИндексированнуюТаблицу и искать в ней.

    И какой для этого фильтр ставить?
      
    Наверх
    ICQ  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


    я хочу, чтоб сюда проложили
    дорогу оттуда...

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #18 - 28. Июня 2006 :: 20:11
    Печать  
    Ну я какой поставил?

    Для заданной подстроки поиска _стр:

    ФильтрМин = _стр +Симв(1);
    ФильтрМин = _стр +Симв(255);
    ФильтрМакс = _стр +Симв(255);

    Это если по научному.
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


    я хочу, чтоб сюда проложили
    дорогу оттуда...

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #19 - 28. Июня 2006 :: 20:14
    Печать  
    Вот если бы у тебя строка поиска просто по вхождению была бы, типа "Like %xxx%", или рег. выражения, тогда - да.
    А по первым символам - не вижу проблемы.

    P.S.
    И если хочешь поиск выполнять без учета регистра - не забудь соотв. модификатор в индексе.
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    vip
    1c++ power user
    Отсутствует



    Сообщений: 1570
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #20 - 28. Июня 2006 :: 20:19
    Печать  
    Цитата:
    ФильтрМин = _стр +Симв(1);
    ФильтрМин = _стр +Симв(255);

    Это ты что-то не то написал.
    Но мысль понятна. Буду проверять.
      
    Наверх
    ICQ  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


    я хочу, чтоб сюда проложили
    дорогу оттуда...

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #21 - 28. Июня 2006 :: 20:22
    Печать  
    Ну, разумеется, не то.

    Вот это
    Цитата:
    ФильтрМин = _стр +Симв(255);

    на самом деле, ФильтрМакс, конечно.

    Почему "Ы" - чтоб никто не догадался Улыбка
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    vip
    1c++ power user
    Отсутствует



    Сообщений: 1570
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #22 - 28. Июня 2006 :: 20:28
    Печать  
    Да дело не в Максе, а в том, что это вернет.
    Ты наверное имел в виду от Симв(1) до Симв(255).
    Тогда надо еще учитывать максимальную длину наименования для задания фильтра.
    И весь выигрыш времени пойдет насмарку.
    Тогда уж лучше перебором списка.
    Или не так?
      
    Наверх
    ICQ  
    IP записан
     
    vip
    1c++ power user
    Отсутствует



    Сообщений: 1570
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #23 - 28. Июня 2006 :: 20:35
    Печать  
    Как, интересно, в 1С поиск по первым символам сделан?
      
    Наверх
    ICQ  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


    я хочу, чтоб сюда проложили
    дорогу оттуда...

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #24 - 28. Июня 2006 :: 20:41
    Печать  
    vip писал(а) 28. Июня 2006 :: 20:28:
    Да дело не в Максе, а в том, что это вернет.
    Ты наверное имел в виду от Симв(1) до Симв(255).
    Тогда надо еще учитывать максимальную длину наименования для задания фильтра.
    И весь выигрыш времени пойдет насмарку.
    Тогда уж лучше перебором списка.
    Или не так?

    Не совсем так, конечно.

    Как работает индекс с фильтром:
    У тебя есть 2 буквы "Пе";
    Тебе нужно найти все, что больше "Пе...", но меньше "Пё...".
    "Пе"+Симв(1) заведомо меньше любой строки на "Пе".
    "Пе"+Симв(255) - это должно быть больше любой строки в твоем списке.

    Поэтому здесь я не совсем правильно сказал.
    Не Симв(255), а достаточно длинная строка с последним символом твоего алфавита.
    Для русского надо добивать маленькими буквами "я".

    Короче, попробуй сам Улыбка
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


    я хочу, чтоб сюда проложили
    дорогу оттуда...

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #25 - 28. Июня 2006 :: 20:42
    Печать  
    vip писал(а) 28. Июня 2006 :: 20:35:
    Как, интересно, в 1С поиск по первым символам сделан?

    Намного хуже, чем сделаешь ты. Серьезно, он же тормозной, как абстинентная черепаха.
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    vip
    1c++ power user
    Отсутствует



    Сообщений: 1570
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #26 - 28. Июня 2006 :: 20:49
    Печать  
    Цитата:
    Не Симв(255), а достаточно длинная строка с последним символом твоего алфавита.

    Я это и имел ввиду. Только не "достаточно длинная", а точно такой длины, как наименование. Иначе ничего не найдет.
    Цена вопроса получается слишком высокой и перебор нескольких сотен отфильтрованных элементов группы, наверное, имеет право на жизнь. Улыбка
    Не по теме, раз ты тут.
    Что скажешь по поводу Система.Активизировать("Наименование") для формы списка справочника?
      
    Наверх
    ICQ  
    IP записан
     
    vip
    1c++ power user
    Отсутствует



    Сообщений: 1570
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #27 - 28. Июня 2006 :: 20:50
    Печать  
    Цитата:
    как абстинентная черепаха

    Очень довольный
      
    Наверх
    ICQ  
    IP записан
     
    kms
    1c++ power user
    1c++ moderator
    Отсутствует


    я хочу, чтоб сюда проложили
    дорогу оттуда...

    Сообщений: 4632
    Зарегистрирован: 19. Мая 2006
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #28 - 28. Июня 2006 :: 23:08
    Печать  
    vip писал(а) 28. Июня 2006 :: 20:49:
    Я это и имел ввиду. Только не "достаточно длинная", а точно такой длины, как наименование. Иначе ничего не найдет.

    Можно и длиннее, чем наименование, но разницы не будет.
    Если будет короче - найти - найдет, просто выборка может быть не полной.

    Цитата:
    Не по теме, раз ты тут.
    Что скажешь по поводу Система.Активизировать("Наименование") для формы списка справочника?

    Не готов пока ответить.
    Честно, на работе - напряг, на даче - крыша, на носу - отпуск.

    Все как у всех Улыбка
      

    De quelle planète es-tu?
    Наверх
     
    IP записан
     
    ADirks
    1c++ developer
    1c++ moderator
    Отсутствует


    А нужны ли мы нам?

    Сообщений: 692
    Местоположение: Новосибирск
    Зарегистрирован: 22. Мая 2006
    Пол: Мужской
    Re: ИндекированнаяТаблица. Нечеткий поиск строки.
    Ответ #29 - 29. Июня 2006 :: 03:33
    Печать  
    vip писал(а) 28. Июня 2006 :: 19:06:
    Цитата:
    А метод НайтиБлижайшуюБольше() разве не спасёт Отца Русской Демократии?  По-моему так самое оно.

    Нет. Все-таки не спас Злой
    Работает так.
    Находит слово, начинающееся с первой буквы ключа и все. На дальнейшее увеличение длины ключа не реагирует.
    Пример.
    Патрушев
    Петров.
    Ключ "П" - результат Патрушев.
    Ключ "Пе" - результат Патрушев.

    Если такого нет, находит следующее по алфавиту.
    Абыдно...

    Фу блин... Напугал...  Но напугал с пользой для дела - теперь есть тест на поиск  Улыбка
    Думаю у тебя там с регистром букв что-то не то, потому что тест работает
    Код
    Выбрать все
    Процедура тестНайтиБлижайшую_Строки() Экспорт
    	Сам = Сам();
    	ИТ = СоздатьОбъект("ИндексированнаяТаблица");
    	ИТ.НоваяКолонка("к1");
    
    	ИТ.НоваяСтрока();
    	ИТ.к1 = "Иванов";
    	ИТ.НоваяСтрока();
    	ИТ.к1 = "Патрушев";
    	ИТ.НоваяСтрока();
    	ИТ.к1 = "Петров";
    	ИТ.НоваяСтрока();
    	ИТ.к1 = "Сидоров";
    
    	ИТ.ДобавитьИндекс("и1", "к1");
    	Сам.ПроверитьРавенство(ИТ.НайтиБлижайшуюБольше("Пе", "и1"), 3);
    	Сам.ПроверитьРавенство(ИТ.НайтиБлижайшуюБольше("пе", "и1"), 2);
    
    	ИТ.ДобавитьИндекс("и2", "^к1");
    	Сам.ПроверитьРавенство(ИТ.НайтиБлижайшуюБольше("ПЕ", "и2"), 3);
    	Сам.ПроверитьРавенство(ИТ.НайтиБлижайшуюБольше("пе", "и2"), 3);
    КонецПроцедуры
     
    
    

    У тебя скорее всего вместо ТЗ.НайтиБлижайшуюБольше("Пе", "и1") получается ТЗ.НайтиБлижайшуюБольше("пе", "и1") вот и находится первое слово на "П", потому что "п" < "П".

    Самое простое - построй индекс без учёта регистра, т.е. типа так:
    Код
    Выбрать все
    ТЗ.ДобавитьИндекс("и1", "^к1"); 
    
    
    и всё должно заработать.
      
    Наверх
     
    IP записан
     
    Переключение на Главную Страницу Страницы: 1 [2] 3 
    ОтправитьПечать