AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zeichen in Query optimal aufteilen

Ein Thema von Maekkelrajter · begonnen am 2. Okt 2022 · letzter Beitrag vom 27. Okt 2022
Antwort Antwort
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
793 Beiträge
 
#1

AW: Zeichen in Query optimal aufteilen

  Alt 2. Okt 2022, 14:00
Ungetestet:

Delphi-Quellcode:
var
  l1, l2, l3: Integer;
begin
  l1 := Length(title);
  l2 := Length(artist);
  l3 := Length(album);
  while (l1 + l2 + l3) > 100 do begin
    if l1 > 34 then
      Dec(l1);
    if (l1 + l2 + l3) <= 100 then
      break;
    if l2 > 33 then
      Dec(l2);
    if (l1 + l2 + l3) <= 100 then
      break;
    if l3 > 33 then
      Dec(l3);
  end;
  setlength(title, l1);
  setlength(artist, l2);
  setlength(album, l3);

end;
  Mit Zitat antworten Zitat
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
158 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zeichen in Query optimal aufteilen

  Alt 4. Okt 2022, 13:16
Wie es aussieht, ist die Lösung des Problems doch einfacher als ich dachte. Himitsus mathematischer Ansatz ist zwar 'smarter', aber der Vorschlag von Olli73 schien mir vor allem wegen seiner einfachen und (für mich) gut durchschaubaren Struktur für meine Zwecke am besten geeignet.

Auf der Basis dieses Codes habe ich folgende Routine entwickelt:
Delphi-Quellcode:
Function GetQuery(title,artist,album: string): string;
var qlen,namlen,artlen,alblen: Integer;
    const nam = 40; // Werte können evtl. noch zur Optimierung des Suchergebnisses variiert werden
          art = 30;
          alb = 30;
          maxlen = nam + art + alb; // maximal 100
begin
  namlen:= length(Title);
  artlen:= length(artist);
  alblen:= length(album);
  qlen:= namlen + artlen + alblen;
  If qlen > maxlen Then
  begin
    while qlen > maxlen do
    begin
      if alblen > alb then // Reihenfolge nach Priorität der Elemente
      begin
        Dec(alblen);
        dec(qlen);
        if qlen <= maxlen then break;
      end;
      if artlen > art then
      begin
        Dec(artlen);
        dec(qlen);
        if qlen <= maxlen then break;
      end;
      if namlen > nam then
      begin
        Dec(namlen);
        dec(qlen);
      end;
    end;
    setlength(title,namlen);
    setlength(artist,artlen);
    setlength(album,alblen);
  end;
  result:= title + artist + album;
end;
Das scheint hervorragend zu funktionieren. Die Trefferquote bei der Suche ist jedenfalls geradezu sensationell. Für die Konstanten werde ich noch einen Konfigurationsdialog basteln, der nur die Eingabe von Werten erlaubt, deren Summe den Maximalwert nicht überschreitet.
Nochmals Danke für die Hilfe!

Gruß LP
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.542 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zeichen in Query optimal aufteilen

  Alt 4. Okt 2022, 16:38
Bei Olliver mußt du nur aufpassen, es wird von Allem gleich viel abgeschnitten,
also bleibt womöglich nur noch der Längste übrig.

Ein ganz langes Wort bekommt quasi Alles, von den kürzeren zu langen Wörtern.

**
*****++++++
*****+++++++++

**
*****++
*****+++++++++

Andersrum, also vom Kürzesten (längstem ohne Abschneiden) an Buchstaben hinzu, so lange noch Platz ist, würde die freien Buchstaben gleichmäßig verteilen

**
*****++++++
*****+++++++++

**
*****++
*****+++++++++

(nicht maßstabsgetreu)

Die mathematische Lösung kommt etwa auf das, wenn man Beides kombiniert, also das Mittelding, wie wenn man abwechselnd Stellen entfernt und hinzufügt

**
*****++++++
*****++++++++

**
*****++
*****+++++++++


Jenachdem was Einem wichtiger ist, gibt es optimalere Lösungen, wie man die Stellen verteilt (wie viel man wo weglässt)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Okt 2022 um 16:53 Uhr)
  Mit Zitat antworten Zitat
Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
158 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zeichen in Query optimal aufteilen

  Alt 4. Okt 2022, 22:48
Bei Olliver mußt du nur aufpassen, es wird von Allem gleich viel abgeschnitten,
also bleibt womöglich nur noch der Längste übrig.

Ein ganz langes Wort bekommt quasi Alles, von den kürzeren zu langen Wörtern.
Das kann überhaupt nicht passieren. Es wird nur abgeschnitten, solange die Gesamtlänge > 100 und der einzelne Filter länger als die vordefinierte Länge ist, in unserem Fall 30 bzw 40 Zeichen. Filter, die kleiner oder gleich 30 (40) Zeichen lang sind, werden nicht abgeschnitten. Wie man aus den Beispielen im Anhang sehen kann, funktioniert das einwandfrei.
Das einzige Problem ist wohl, ob die verbliebenen Fragmente für die Suche ausreichend signifikant sind. Erfahrungsgemäß sind die ersten Zeichen die wichtigsten und reichen in der Kombination Titel - Artist - Album fast immer für die Erkennung aus. Die Beispiele im Anhang wurden jedenfalls alle gefunden. Vermutlich verwendet Spotify ausgeklügelte Suchalgorithmen. Notfalls kann ich in meinem Programm die Suchfilter auch manuell modifizieren. Für den vorgesehenen Verwendungszweck ist die jetzige Lösung jedenfalls völlig ausreichend.

Gruß LP
Angehängte Grafiken
Dateityp: jpg TrimQuery.jpg (65,5 KB, 26x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz