Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

поиск слов   Найти похожие ветки 

 
Сорокин М   (2007-03-25 19:22) [0]

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


 
Джо ©   (2007-03-25 19:26) [1]

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

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


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

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


 
Johnmen ©   (2007-03-25 19:35) [3]

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


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

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


 
default ©   (2007-03-26 01:26) [5]

мне не на чем попробовать, но интересно вот что: если я добавляю в сортируемый 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.
(справка работает, а делфи слетела что-то)


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

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

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


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


> 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:50) [8]

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


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

посидел подумал,и сделал)
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;


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

спс за ответы,помогли.
след. кодом добавляю в грёд данные,но строка
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;


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.059 c
2-1174889808
Megabyte
2007-03-26 10:16
2007.04.15
Отлов нужного исключения


15-1174470510
boriskb
2007-03-21 12:48
2007.04.15
Из истории советской цензуры


2-1174879808
sergeyxxx
2007-03-26 07:30
2007.04.15
Работа с принтером


3-1168453623
Juice
2007-01-10 21:27
2007.04.15
Ошибочный результат ХП


2-1175140126
Steep
2007-03-29 07:48
2007.04.15
Расширения