Szukanie pozycji w stringu przez porównanie

0

Mam pytanie jak wyszukać nr pozycji w stringu:

Mam taki tekst wpisany w ListBox:

a b c d e f | a f
d k i j x c | x c

Chodzi mi teraz o wyszukanie pozycji to co jest po znaku |.
czyli :
a f = 1 6
x c = 5 6

Zatem chce w listbox uzyskać taki wpis :

a b c d e f | a f = 1 6
d k i j x c | x c = 5 6

0

Kryształowa kula mówi: - użyj generatora liczb losowych.

0

Mi chodzi raczej o wyszukiwanie przez pos

0

Co mają te 16 oraz 56 do wyszukiwania przez pos?

0

to sa liczby ktore okreslaja pozycje znakow po kresce |.... wg mnie :)

ja bym to widzial tak:

  1. rozbicie ciagu XXXX|ZZ na dwa podciagu XXXX oraz ZZ
  2. szukanie Z w XXXX i wynik gdzies zapisac np do tablicy
    itd

potem wypisanie z tablicy pozycji.

Faktycznie Pos wystarczy + Copy

0

Nie znam się na delphi, ale wszystkie jezyki maja cos wspolnego wiec powiem ze w c++ wygladaloby to tak:

 
Skopiuj editbox do stringa.
 int i = 0,j=0; bool a = false;

while(string[i])
{
if(string[i] == '|') { a = true;}
i++;
if(a){
while(string[j]!=string[i]) j++;
wypiszgdzies(j+1);
j=0;
}
};

nie sprawdzalem czy dziala ;d

0

Najpierw rozdziel string na dwa: jeden zawierający tekst przed |, a drugi po - następnie rozdziel ten drugi tekst po spacji na tablicę (tak że pierwszy element tablicy to a, drugi to f, w przypadku przykładu pierwszego), po tym wystarczy już zwykła pętla oraz System.Pos.
No, i trochę wyobraźni.

0
var I,P:Integer;
var Str,Add,Left:String;

for I:=0 to ListBox1.Items.Count-1 do
begin
  Str:=ListBox1.Items[I];
  Add:=' =';
  P:=Pos('|',Str);
  if P<=0 then Continue;
  Left:=Copy(Str,1,P-1);
  while P<Length(Str) do
  begin
    Inc(P);
    Add:=Add+' '+IntToStr(Pos(Str[P],Left));
  end;
  ListBox1.Items[I]:=Str+Add;
end;
0

W kodzie Dragona jest błędna nazwa zmiennej. Ale i tak mi to zwraca po poprawce inne teksty, niż chce - nasz czciciel "logiki z pupki". Ja bym to zrobił na szybko tak, jak poniżej. Może mniej optymalnie, ale do mnie bardziej przemawia, bo wiem co się dzieje. Oczywiście sposobów żeby to zrobić, jest na pewno więcej. W sumie to @Bruno(M) jako doświadczony forumowicz powinieneś do bólu kombinować najpierw samodzielnie, o czym już pisałem tutaj nie raz. I dopiero kiedy byś wyczerpał wszystkie możliwości samodzielnego rozwiązania problemu, pisać na forum.

function BrunomLogicFromAss(AInput : string) : string;
const
  Data_Separator = '|';
var
  I, X : integer;
  BeforeSepStr, AfterSepStr, ResPosStr : string;
begin
  Result := AInput;
  X := Pos(Data_Separator, AInput);
  if X > 0 then
  begin
    ResPosStr := '';
    BeforeSepStr := Copy(AInput, 1, X - 1);
    AfterSepStr := Copy(AInput, X, MaxInt);
    BeforeSepStr := StringReplace(BeforeSepStr, #32, '', [rfReplaceAll]);
    for I := 1 to Length(AfterSepStr) do
    begin
      if AfterSepStr[I] in ['a'..'z', 'A'..'Z'] then
      begin
        X := Pos(AfterSepStr[I], BeforeSepStr);
        if X > 0 then
        begin
          ResPosStr := ResPosStr + Format(' %d', [X]);
        end;
      end;
    end;
    if ResPosStr <> '' then
    begin
      Result := Format('%s = %s', [AInput, ResPosStr]);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender : TObject);
var
  I : integer;
begin
  for I := 0 to ListBox1.Items.Count - 1 do
  begin
    ListBox1.Items[I] := BrunomLogicFromAss(ListBox1.Items[I]);
  end;
end;

Oczywiście rozwiązanie dla pojedynczych i unikalnych znaków. Ale tak sugeruje nam przykład z pierwszego posta :/

2

@Bruno(M) - to z kolei ja podam procedurę, bazującą na mojej ulubionej, wskaźnikowej metodzie przeszukiwania łańcuchów:

function ProcessInputString(const AInput: AnsiString): AnsiString;
var
  pchrToken, pchrLast: PAnsiChar;
  strChars: AnsiString;
begin
  pchrLast  := @AInput[Length(AInput)];
  pchrToken := @AInput[1];
  Result := AInput + ' =';

  while pchrToken^ <> '|' do
  begin
    if pchrToken^ in ['a' .. 'z'] then
      strChars := strChars + pchrToken^;

    Inc(pchrToken);
  end;

  while pchrToken <= pchrLast do
  begin
    if pchrToken^ in ['a' .. 'z'] then
      Result := Result + ' ' + IntToStr(Pos(pchrToken^, strChars));

    Inc(pchrToken);
  end;
end;

Dla przykładu, poniższe wywołania funkcji:

ProcessInputString('a b c d e f  | a f')
ProcessInputString('d k i  j x c | x c')

zwrócą następujące łańcuchy:

'a b c d e f  | a f = 1 6'
'd k i  j x c | x c = 5 6'

czyli dokładnie to, czego oczekujesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1