Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

поиск слов


Сорокин М ©   (2007-03-25 19:22:00) 

в memo текст:
N1[3]
N1[5]
N2[8]
N1[5]
N2[8]
прошу помочь с реализацией поиска одинаковых строк
и записи в другое memo: скажем N1[5]=2 (2 одинаковых строки),
N2[8]=2, N1[3]=1
Благодарю за внимание и надеюсь на помощь


Сорокин М   (2007-03-26 12:52:00) [1]

хы,все здесь правильно,я прост один ньюан не учел сорри


Сорокин М   (2007-03-26 12:33:00) [2]

спс за ответы,помогли.
след. кодом добавляю в грёд данные,но строка
stringgrid3.Cells[index,index2]:=stringgrid3.Cells[index,index2]+';'+memo2.Lines.Strings[i];
оказалась проблемной,добавляет саму себя много раз,помогите понять в чем дело
var
xz1,xz2:integer;
xv1,xv2:integer;
k,i,j:integer;
index,index2:integer;
begin
for i:=0 to memo2.Lines.Count -1 do begin
xz1:=posex('L',memo2.Lines.Strings[i])+1;
xz2:=posex('[',memo2.Lines.Strings[i])-2;
index:=strtoint(copy(memo2.Lines.Strings[i],xz1,xz2));
xv1:=posex('[',memo2.Lines.Strings[i])+1;
xv2:=posex(']',memo2.Lines.Strings[i]);
index2:=strtoint(copy(memo2.Lines.Strings[i],xv1,xv2-xv1))-1;
if stringgrid3.Cells[index,index2]='' then
stringgrid3.Cells[index,index2]:=memo2.Lines.Strings[i]
else
stringgrid3.Cells[index,index2]:=stringgrid3.Cells[index,index2]+';'+memo2.Lines.Strings[i];
end;


bagos   (2007-03-26 10:54:00) [3]

посидел подумал,и сделал)
var
s1,s2 : TStringlist;
i , index,count: Integer;
k,l:integer;
begin
s1:=tstringlist.Create;
s2:=tstringlist.Create;
for i := 0 to Memo2.Lines.Count -1 do
 begin
 index := s1.IndexOf(Memo2.Lines[i]) ;
 if  index = -1 then
   begin
     s1.Add(Memo2.Lines[i]);
     s2.Add('1');
  end
 else
   begin
    count := StrToInt(s2.Strings[index]);
     Inc(count);
     s2.Strings[index] := IntToStr(count);
end;


default   (2007-03-26 01:50:00) [4]

Германн ©   (26.03.07 01:37) [7]
возвращает по делу:)
тогда сабж можно решить соответствующим образом среди прочих решений(обычно сортируют сначала, потом пробегаются для получения строк и их числа повторений)
здесь можно слегка по-другому
ну понятно уже как...
добавляем строку, смотрим увеличилась-ли длина списка и если нет, то по индексу полученному от Add увеличиваем счётчик строк(например, в связанном со строкой объекте)
вообщем вариант ещё один


Германн   (2007-03-26 01:37:00) [5]


> default ©   (26.03.07 01:26) [5]
>
> мне не на чем попробовать, но интересно вот что: если я
> добавляю в сортируемый TStringList с dupIgnore строку уже
> содержащуюся в списке методом Add, он возвратит индекс добавляемой
> строки в списке или вернет навроде -1?
> в справке про это нет

Ответ в исходниках (Д6):
function TStringList.Add(const S: string): Integer;
begin
 Result := AddObject(S, nil);
end;

function TStringList.AddObject(const S: string; AObject: TObject): Integer;
begin
 if not Sorted then
   Result := FCount
 else
   if Find(S, Result) then
     case Duplicates of
       dupIgnore: Exit;
       dupError: Error(@SDuplicateString, 0);
     end;
 InsertItem(Result, S, AObject);
end;


А затем в хэлп:
Locates the index for a string in a sorted list and indicates whether a string with that value already exists in the list.

function Find(const S: string; var Index: Integer): Boolean; virtual;

Но можно и в исходники залезть:
function TStringList.Find(const S: string; var Index: Integer): Boolean;
var
 L, H, I, C: Integer;
begin
 Result := False;
 L := 0;
 H := FCount - 1;
 while L <= H do
 begin
   I := (L + H) shr 1;
   C := CompareStrings(FList^[I].FString, S);
   if C < 0 then L := I + 1 else
   begin
     H := I - 1;
     if C = 0 then
     begin
       Result := True;
       if Duplicates <> dupAccept then L := I;
     end;
   end;
 end;
 Index := L;
end;


default   (2007-03-26 01:34:00) [6]

Add returns the position of the item in the list, where the first item in the list has a value of 0.

хотя вроде как и написано, неявно правда
вообщем есть сомнения всё равно ибо явно не указано


default   (2007-03-26 01:26:00) [7]

мне не на чем попробовать, но интересно вот что: если я добавляю в сортируемый TStringList с dupIgnore строку уже содержащуюся в списке методом Add, он возвратит индекс добавляемой строки в списке или вернет навроде -1?
в справке про это нет
Adds a new string to the list.

function Add(const S: string): Integer; override;

Description

Call Add to add the string S to the list. If the list is sorted, S is added to the appropriate position in the sort order. If the list is not sorted, S is added to the end of the list. Add returns the position of the item in the list, where the first item in the list has a value of 0.

Note: For sorted lists, Add will raise an EListError exception if the string S already appears in the list and Duplicates is set to dupError. If Duplicates is set to dupIgnore, trying to add a duplicate string to a sorted list does nothing.
(справка работает, а делфи слетела что-то)


RASkov   (2007-03-26 01:13:00) [8]

Поищи по форуму "Подсчет дупликатов" или "удаление дупликатов" или что-то в этом духе... недавно было.. правда там вроде с листбоксами ну это ничего не меняет. те-же Итемы.


Johnmen   (2007-03-25 19:35:00) [9]

Начни с теории. Что такое строка, что такое символ, как сравниваются строки и символы...
Реализацией занимаются обычно после освоения теории.


Сорокин М   (2007-03-25 19:28:00) [10]

не знаю с чего начать реализацию,никада не занимался парсингом текста


Джо   (2007-03-25 19:26:00) [11]

> прошу помочь с реализацией поиска одинаковых строк

А в чем конкретно проблема?


Наверх

Титульная страница Поиск, карта сайта Написать письмо