AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Live Stichwortsuche

Ein Thema von Ajintaro · begonnen am 24. Feb 2014 · letzter Beitrag vom 27. Feb 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 10:22
Entweder ist das Zeichen Whitespace oder nicht.

Wenn kein Whitespace dann das Zeichen an den Buffer (string) geben
Wenn Whitespace und der Buffer nicht leer ist, den Buffer an das Array und den Buffer wieder leeren.
Delphi-Quellcode:
function ParseSearchStr( const SearchStr : string ) : TArray<string>;
var
  LCount : integer;
  LBuffer : string;
  LChar : Char;
begin
  SetLength( Result, Length( SearchStr ) div 2 + 1 );
  LCount := 0;
  for LChar in SearchStr do
  begin
    if ( LChar = ' ' ) and ( LBuffer <> '' ) then
    begin
      Result[LCount] := LBuffer;
      Inc( LCount );
      LBuffer := '';
    end
    else
      LBuffer := LBuffer + LChar;
  end;
  if LBuffer <> 'then
  begin
    Result[LCount] := LBuffer;
    Inc( LCount );
  end;
  SetLength( Result, LCount );
end;
Bevor du mich fragst, warum ich das Ausgabe-Array auf Length( SearchStr ) div 2 + 1 initialisiere, überlege dir wieviele Teile ein String maximal haben kann, wenn diese durch ein Trennzeichen abgegrenzt werden
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (27. Feb 2014 um 09:08 Uhr) Grund: Das letzte Wort wurde nicht in das Array geschrieben
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#12

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 10:30
Ähnlich habe ich das auch gerade umgesetzt (nur ohne Generics):
Delphi-Quellcode:
type
  TDynStringArray = array of string;

function StrToArray(const InputStr: string): TDynStringArray;
var
  PLast, PCurrent: PChar;
  s: string;
  ArrayIndex: integer;
begin
  SetLength(Result, Length(InputStr) div 2);
  ArrayIndex := Low(Result);
  PLast := PChar(InputStr);
  PCurrent := PChar(InputStr);
  while PCurrent^ <> #0 do
    begin
      if PCurrent^ = ' then
        begin
          SetString(s, PLast, PCurrent - PLast);
          Result[ArrayIndex] := s;
          inc(ArrayIndex);
          PLast := CharNext(PCurrent);
        end;
      PCurrent := CharNext(PCurrent);
    end;
  SetString(s, PLast, PCurrent - PLast);
  Result[ArrayIndex] := s;
  SetLength(Result, ArrayIndex + 1);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#13

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 11:11
das das zaubert ihr mal eben so raus ?

Das ist natürlich ein schlauer Ansatz: nur wenn der buffer leer ist und im suchstring ein whitespace vorkommt, findet eine Übergabe an das array statt. Dabei muss das Suchwort aus mindestens ein 2 Chars bestehen. D.h. man muss nicht einmal das Wort voll ausschreiben, man kann es auch abgekürzt übergeben! Genial.
Bei erfolgreicher Übergabe wird der Puffer wieder geleert, andernfalls um ein weiteres Zeichen ergänzt.

Das hat mir sehr geholfen und wird vermutlich vielen anderen auch eine große Hilfe sein.
Jaimy
DAoC 2.0 -> Camelot Unchained !
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 20:47
das das zaubert ihr mal eben so raus ?
Ähm, ja ... ich überlege mir immer wie ich das "zu Fuß" bzw. "per Hand" machen würde.
Also auf einem Blatt Papier steht ein Satz und ich soll alle Worte einzeln untereinander schreiben.

Wenn man jetzt einmal ganz genau darauf achtet, was man wirklich da macht, und sich zusätzlich einmal vorstellt, dass die Worte in einer mir völlig fremden Sprache (aber schon links-nach-rechts) sind, dann muss ich genau so vorgehen wie das der Rechner machen muss.

Das kleide ich jetzt in Befehle und der Drops ist gelutscht
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
michaelthuma
(Gast)

n/a Beiträge
 
#15

AW: Live Stichwortsuche

  Alt 26. Feb 2014, 22:20
Ja. Das gute alte C und Pascal So wie es sich gehört. Programmieren ist noch nicht verboten.

An sich gehört das Ergebnis in eine Liste. Aber nur in der Javawelt Da musst du zum Architekten gehen und Buße tun. Der labert dann wirres Zeug von Matrizen und so. So ist das in der Pascal Welt nicht. Da reichts wenn es läuft und schnell ist, davon haben die Benutzer ein Nutzen und sind nicht die Benutzten.

Delphi intern ist auch eine Liste wie gehabt ein dynamisches Array.

Rein zur Ergänzung ...

Meine Erfahrung je nach DB eher Anzahl der Sätze sollten ein Kriterium ca. 3 Zeichen lang sein, wenn du Objekte erzeugst. Sonst gehen 2. Wenn 3 nicht reichen dann besser mit Tastatur bestätigen lassen die Suche. Hängt an sich von der Arbeitsumgebung ab. Zumeist je mehr Sätze desto der müder der Rechner. Die Hardwareausstattung ist sehr oft umgekehrt proportional zum Nutzen im Arbeitsprozess oder die Hardware einfach älter, da solche Systeme sich ungern jemand traut anzugreifen.

Es gibt Datenbanken die mit %LIKE% nicht so wirklich ein Freude haben. Einer ordentlichen Datenbank ist das heute egal. Das gute alte Access war da etwas pingelig. Selbst bei bescheidenen ca. 100k Sätzen auf einem Celeron oder P IV. Solche Rechner gibt es noch ... da entsteht ein Verzögerung bei der Eingabe selbst ohne Objekterzeugung.

Es sind nicht mehr Zeichen unbedingt weniger Datensätze. 'Love' respektive 'Liebe' in einem Musikrepertoire ist überrepräsentiert.

Dann nimmt man mal einen Kellner im Stress bei der Suche. Der soll ja servieren und nicht auf der Anlage rumspielen. Aber was soll der tun wenn sich die Granny aufrafft und was modernes sich wünscht fürs Enkerl so etwas wie 'Mit BO von U2'. Ist am Ende 'Born in the USA vom Springsteen und das Enkerl kennt das trotzdem nicht...

Früher musste man noch berücksichtigen, dass die Leute das Telefon unterm Kinn hatten... die haben auch nicht viel Freude mit dem Warten. Das Szenario an sich spielt eine Rolle. Suchen und Hektik gehören irgendwie zusammen. Deswegen soll das Suchen wirklich schnell gehen.

An sich aber die beiden vorgeschlagene Variante der bessere Weg im Mittel. Der hält an sich recht gut.

das das zaubert ihr mal eben so raus ?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Live Stichwortsuche

  Alt 27. Feb 2014, 09:03
Ähnlich habe ich das auch gerade umgesetzt (nur ohne Generics):
Delphi-Quellcode:
type
  TDynStringArray = array of string;

function StrToArray(const InputStr: string): TDynStringArray;
var
  PLast, PCurrent: PChar;
  s: string;
  ArrayIndex: integer;
begin
  SetLength(Result, Length(InputStr) div 2);
  ArrayIndex := Low(Result);
  PLast := PChar(InputStr);
  PCurrent := PChar(InputStr);
  while PCurrent^ <> #0 do
    begin
      if PCurrent^ = ' then
        begin
          SetString(s, PLast, PCurrent - PLast);
          Result[ArrayIndex] := s;
          inc(ArrayIndex);
          PLast := CharNext(PCurrent);
        end;
      PCurrent := CharNext(PCurrent);
    end;
  SetString(s, PLast, PCurrent - PLast);
  Result[ArrayIndex] := s;
  SetLength(Result, ArrayIndex + 1);
end;
Das Array sollte mit Length( InputStr ) div 2 + 1 initialisiert werden, denn 'a b' ergibt 2 Suchworte, aber du initialisierst mit 3 div 2 = 1 und es knallt

Dafür würde bei meiner Version das letzte Wort nicht in das Array geschrieben und du müsstest bei deiner Version nur 2 Zeilen tauschen, damit es trotzdem funktioniert.
(Ist gefixed)

Ein weiteres Problemchen ist, dass bei 'a b ' als Ergebnis ['a','b',''] geliefert wird, aber dafür gibt es ja auch die UnitTests
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (27. Feb 2014 um 09:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#17

AW: Live Stichwortsuche

  Alt 27. Feb 2014, 09:29
Da war noch ein anderer Denkfehler drin: mehrere Trennzeichen hintereinander oder nur Trennzeichen im String sollten IMO ignoriert werden. Das sieht nun so aus:
Delphi-Quellcode:
type
  TDynStringArray = array of string;

function StrToArray(const InputStr: string): TDynStringArray;
var
  PLast, PCurrent: PChar;
  s: string;
  ArrayIndex: integer;
begin
  SetLength(Result, Length(InputStr) div 2 + 1);
  ArrayIndex := Low(Result);
  PLast := PChar(InputStr);
  PCurrent := PChar(InputStr);
  while PCurrent^ <> #0 do
    begin
      if PCurrent^ = ' then
        begin
          SetString(s, PLast, PCurrent - PLast);
          if s <> 'then
            begin
              Result[ArrayIndex] := s;
              inc(ArrayIndex);
            end;
          PLast := CharNext(PCurrent);
        end;
      PCurrent := CharNext(PCurrent);
    end;
  SetString(s, PLast, PCurrent - PLast);
  if s <> 'then
    begin
      Result[ArrayIndex] := s;
      inc(ArrayIndex);
    end;
  SetLength(Result, ArrayIndex);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#18

AW: Live Stichwortsuche

  Alt 27. Feb 2014, 09:53
Hätte man das nicht einfach mit 'ner TStringlist machen können und das Leerzeichen als Delimiter?
OK, im Falle doppelter Leerzeichen hintereiander hätte man leere Strings in der Liste, die man erst rauslöschen müsste.
Wäre wahrscheinlich langsamner, oder?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: Live Stichwortsuche

  Alt 27. Feb 2014, 10:13
Hätte man das nicht einfach mit 'ner TStringlist machen können und das Leerzeichen als Delimiter?
OK, im Falle doppelter Leerzeichen hintereiander hätte man leere Strings in der Liste, die man erst rauslöschen müsste.
Wäre wahrscheinlich langsamner, oder?
Hier ist als Whitespace nur das Leerzeichen definiert. Die Erfahrung zeigt aber, dass in der Realität mehrere Zeichen als Whitespace genommen werden (z.B. ' ,.?!;' ) und diese Funktion berücksichtigt das dann einfach und bei einer StringList muss ich erst vorher alles umwandeln.

Beliebt ist es auch zusammenhängende Wörter in "" zu setzen, die dann trotz Whitspace zusammenbleiben.

Input: '"Hallo du",da!' Output: ['Hallo du','da'] Auch wäre eine Erweiterung denkbar um bestimmte Begriffe auszuschließen, dann müsste man sich aber ein anderes Ausgabeformat überlegen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (27. Feb 2014 um 10:17 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#20

AW: Live Stichwortsuche

  Alt 27. Feb 2014, 12:19
Delphi-Quellcode:
Procedure SentenceToWords (const sentence : String; words : TStringList)
Var
  c : Char;
  word : String;

begin
  for c in sentence do
    if IsWhiteSpace(c) then
      if Length(word)>0 then begin
        words.Add(word);
        word := '';
      end else
    else if IsLetterOrDigit(c) then
      word := word + c;

  if Length (word)>0 then
    words.Add(word);
end;
Ungetestet. Die Funktionen 'IsWhiteSpace' und 'IsLetterOrDigit' sind natürlich nachzuliefern (falls es sie noch nicht gibt).
Ist zwar vielleicht ein wenig langsamer, aber ob nun 10 Nanosekunden oder 30 ist -denke ich- nicht ganz so tragisch. Dafür ist es imho einfacher zu verstehen und wenigstens kann ich mit Strings arbeiten und muss mich nicht mit PChar rumschlagen, wieso hab ich mich denn für Delphi entschieden? Bei dem PChar-Geraffel hätte ich gleich C nehmen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz