Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 16:50   #1
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию как найти одинаковые слова в memo?

Нужно найти самые часто повторяющиеся слова в Memo. Подскажите, как это можно сделать?
gylayko вне форума Ответить с цитированием
Старый 04.04.2013, 14:41   #2
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

создай масив повторений
бери каждую строчку и проверяй остальные ровна ли она той если равна записывай в масив
дальше можешь вывести масив и увидить сколько раз повторялась та или иная строка
jone вне форума Ответить с цитированием
Старый 04.04.2013, 15:41   #3
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Я бы сделал немного по другому:
построчно разбить строку на слова (разделитель пробел)
каждое слово сверять с масивом и если
- слово в масиве отсутствует тогда добавлять его в масив и тут же этому слову ставить "счетчик" в еденицу
- слово присутствует - увеличить счетчик на еденицу
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 05.04.2013, 15:34   #4
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию

Цитата:
Сообщение от spirit-ua Посмотреть сообщение
Я бы сделал немного по другому:
построчно разбить строку на слова (разделитель пробел)
каждое слово сверять с масивом и если
- слово в масиве отсутствует тогда добавлять его в масив и тут же этому слову ставить "счетчик" в еденицу
- слово присутствует - увеличить счетчик на еденицу
вот примерно так пытаюсь делать
сначала делю строки на слова и вношу их в массив
Код:
for i:=0 to mmoText.lines.count do
  begin
  s := mmoText.Lines[ i ];
 for o:=1 to length(s) do              //в цикле с параметром перебираем все символы строки
    if (s[o]<>' ') and (s[o]<>'.') and (s[o]<>';') and (s[o]<>',') and (s[o]<>'"') and (s[o]<>'/') and (s[o]<>'!') and (s[o]<>':') and (s[o]<>')') and (s[o]<>'(') and (s[o]<>'?') then sl:=sl+s[o] else   //если символ не пробел, добавляем его к слову
       //здесь сможете таким же образом добавить свои символы, которые не могут входить в состав слова
       if length(sl)>0 then             //если длина слова больше 0 (бывает и 0, если несколько пробелов подряд)
          begin                         //начинаем
          inc(q);                       //увеличить счетчик массива
          a[q]:=sl;                     //занести сформированное слово в элемент массива
          sl:='';                       //очистить переменную для нового слова
          end;
end;
и проверка на повторение
Код:
while y<Length(a) do
begin
  a[y]:=slovodlaproverki; //сначала присваиваем первый элемент слову для проверки
  if slovodlaproverki=a[y] then //если совпадает
   begin
    DopArraySlov[w]:=a[y];//заносим слово в еще один строковый массив
    Inc(e);//увеличиваем количество его повторений
    DopArrayCifr[w]:=e;//и заносим это количество в массив с цифрами (количеством повторов)
   end;
  Inc(w); Inc(y);//увеличиваем счетчики массивов
//объяснение: здесь мы создаем еще два массива - один для повторяющихся слов, другой для количества повторов
//индекс у этих массивов один и тот же, получается в результате мы получим, что в первом массиве будет повтоярющиеся слово
//а во втором - количество его повторений
Memo1.Text:=Memo1.Text+'повторяется слово '+DopArraySlov[w];
end;
end;
выводил получившийся массив, там все отлично, делит на слова! но вот возникает ошибка Acces Violation на втором куске, а конкретно на строке DopArrayCifr[w]:=e;
gylayko вне форума Ответить с цитированием
Старый 05.04.2013, 17:40   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А где код, устанавливающий размер этого массива?
И какое значение принимает w в момент возникновения ошибки?
s-andriano вне форума Ответить с цитированием
Старый 05.04.2013, 18:13   #6
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
А где код, устанавливающий размер этого массива?
length(a); а так это просто array of string
Цитата:
Сообщение от s-andriano Посмотреть сообщение
И какое значение принимает w в момент возникновения ошибки?
0
gylayko вне форума Ответить с цитированием
Старый 05.04.2013, 18:28   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от gylayko Посмотреть сообщение
length(a); а так это просто array of string0
length - возвращает размер массива, а устанавливает его
setlength.
Покажите, где Вы устанавливаете размер массива, и каков он в момент выполнения.
Подозреваю, что память под массив просто не распределена (забыли вызвать setlength).
s-andriano вне форума Ответить с цитированием
Старый 05.04.2013, 19:59   #8
gylayko
Форумчанин
 
Регистрация: 14.09.2011
Сообщений: 203
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
length - возвращает размер массива, а устанавливает его
setlength.
Покажите, где Вы устанавливаете размер массива, и каков он в момент выполнения.
Подозреваю, что память под массив просто не распределена (забыли вызвать setlength).
да я, собственно, нигде его не ставлю. а где нужно ставить этот setlength? какой вообще смысл менять размер массива? насколько мне известно, length определяет длину массива. я так уже делал много раз, а тут оказывается, что что-то не так.
gylayko вне форума Ответить с цитированием
Старый 05.04.2013, 20:36   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от gylayko Посмотреть сообщение
какой вообще смысл менять размер массива?
Если массив имеет нулевую длину, то в него даже один элемент не поместится.

А вообще, читайте книжки - они рулез.
Опять же, есть встроенная справка...
s-andriano вне форума Ответить с цитированием
Старый 06.04.2013, 03:31   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

не правильно вы делаете.
Разбейте текст на список слов:
Цитата:
TS.Delimiter:='.';
TS.DelimitedText:='Мой текст1. Моё предложение2. Хрень какая-то....';
Пример выше правильно отработает если разделителем слов будет точка, в вашем случае это пробел, потому выпиливаем все точки и пр. знаки.
Итого получается список внятных букаф.

Удалим же пустые строки и сделаем нижний регистр или верхний:
Код:
for i:=TS.Count -1 downto 0 do
begin
  ts[i]:=UpperCase(Trim(TS[i]));
  if ts[i] = EmptyStr then
  ts.delete(i);
end;
Теперь, в массиве нет пустых мест.

Берем многопоточность:
Кол-во строк в TS делим на желаемое кол-во потоков, остаток от деления загребает последний поток.
Всем потокам отдается исходный текст.

Поток при запуске исходный текст переводит в верхний/нижний регистр:
fTexts:=UpperCase(fTexts);

Дальше ищутся слова в тексте и обрабатывается ивент когда есть итог по слову.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить, есть ли в данной строке одинаковые слова. RoMiRoSSaN Паскаль, Turbo Pascal, PascalABC.NET 0 13.12.2012 10:30
Одинаковые строки Memo Dima_D Общие вопросы Delphi 12 15.07.2012 09:03
паскаль символьный тип (найти одинаковые слова) JosH7 Помощь студентам 4 25.03.2012 23:51
подсвечивающиеся одинаковые слова в Word 2003 Dbnfkbq Microsoft Office Word 1 29.03.2011 03:31
Как найти абсолютно одинаковые строчки и удалить их, и объединить очень похожие? dronkailp Microsoft Office Excel 4 28.10.2009 16:59