AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Array-Sortierung mit großen Zahlen - oder nich?
Thema durchsuchen
Ansicht
Themen-Optionen

Array-Sortierung mit großen Zahlen - oder nich?

Ein Thema von gdv · begonnen am 5. Dez 2006 · letzter Beitrag vom 5. Dez 2006
Antwort Antwort
gdv

Registriert seit: 5. Dez 2006
Ort: Rosenheim
2 Beiträge
 
Delphi 5 Professional
 
#1

Array-Sortierung mit großen Zahlen - oder nich?

  Alt 5. Dez 2006, 10:20
Hi Leute,

das Problem ist schon überall durch - trotzdem steig ich nich durch...

Es geht darum:
Ich muss/soll/darf ein HTML-Analyse-Programm schreiben!

Dazu gehört ein Ranking-Tool, bei dem ich analysiere, ob ein Wort im <title>, etc. steht.
Dabei schreibe ich die Wörter in ein array of string called asKey,
die Anzahl davon in ein integer called as iAnzahl.
Je nach dem wo das Wort gefunden worden ist, bekommt es Punkte, die im array of integer aiPoints stehen.

Wenn jetzt z.B. das Wort "Schokoladen-Bällchen mit Marzipangeschmack" ( ) im Titel vorhanden ist, dann bekommt er 5 Pt.
Sprich:
Delphi-Quellcode:
aiAnzahl:=(iAnzahl+1);
SetLength(asKey,iAnzahl);
SetLength(aiPoints,iAnzahl);
asKey[(iAnzahl-1)]:='Schokoladen-Bällchen mit Marzipangeschmack';
aiPoints[(iAnzahl-1)]:=5;
So, soweit alle alles verstanden? Ja? Cool.

Ich will jetz also lustigerweise es so hinkriegen, dass ich beim Beschreiben der Listbox liRanking das Item mit der höchsten Punktanzahl ganz oben stehen habe und das ganze sortiert bödde

Muss ich das Array sortieren oder wie oder was? Ich hab irgendwie 'n Blackout und komm ned drauf.
MfG Markus.
tach, bin neu hier!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Array-Sortierung mit großen Zahlen - oder nich?

  Alt 5. Dez 2006, 10:31
Hi,
ich schätze mal dein Problem dürfte sein, dass du beim sortieren die Zuordnung von Anzahl-String verlierst. Natürlich kannst du hier umständlich versuchen beide Listen synchron zu halten, ich denke es ist aber einfacher wenn du eine Klasse verwendest, die ein Tupel von Anzahl und Bezeichnung speichert.
Hier kannst du dann statt auf ein Array auch auf eine TObjectList zurückgreifen (intern wird wieder ein Array verwendet). Da hast du dann gleich zwei Vorteile:
  1. Die Liste wächst/schrumpft dyn. mit der Anzahl der Elemente
  2. Die Liste kann aut. sortieren

Der Letzte Punkt ist dann wohl für dich interessant. Da gibt es die Funktion Sort, die einfach den Quicksort implementiert. Der musst du allerdings noch eine Funktion übergeben, die den Vergleich vornimmt. Dabei kannst du dann einfach schauen, wo die Anzahl höher ist und einen entsprechenden Wert zurückgeben (Details siehe OH).

Gruß Der Unwissende
  Mit Zitat antworten Zitat
gdv

Registriert seit: 5. Dez 2006
Ort: Rosenheim
2 Beiträge
 
Delphi 5 Professional
 
#3

Re: Array-Sortierung mit großen Zahlen - oder nich?

  Alt 5. Dez 2006, 10:38
Sry, ich steig nich mit dem Sort durch...
ne besseR: ALLGEMEIN
tach, bin neu hier!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Array-Sortierung mit großen Zahlen - oder nich?

  Alt 5. Dez 2006, 13:54
Herzlich willkommen in der Delphi-PRAXiS, Markus.

Die Zuordnung von Wort und Punktezahl kannst du auch ganz einfach mit der Allzweckwaffe TStringList machen. Die Punktezahl wird dabei einfach im Objects-Array der StringList mitgeführt.

Delphi-Quellcode:
procedure Analyze(const s: String; weight: Integer; words: TStringList);
var
  i, iStart, iWord: Integer;
  inWord: Boolean;
  sWord: String;
begin
  iStart := 0;
  for i := 1 to Succ(Length(s)) do
  begin
    inWord := (i <= Length(s))
        and (s[i] in ['a'..'z', 'A'..'Z', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß']);
    if (iStart = 0) and inWord then iStart := i;
    if not inWord and (iStart > 0) then
    begin
      sWord := Copy(s, iStart, i - iStart);
      iStart := 0;
      iWord := words.IndexOf(sWord);
      if iWord <> -1
        then words.Objects[iWord] := Pointer(Integer(words.Objects[iWord]) + weight)
        else words.AddObject(sWord, Pointer(weight));
    end;
  end;
end;
Das Sortieren ist dann auch nicht sooo schwer:

Delphi-Quellcode:
function CompareInteger(i1, i2: Integer): Integer;
begin
  if i1 < i2 then Result := -1 else
  if i1 > i2 then Result := 1 else
  Result := 0;
end;

function CompareItems(list: TStringList; index1, index2: Integer): Integer;
begin
  Result := CompareInteger(Integer(list.Objects[index2]), Integer(list.Objects[index1]));
end;
Verwenden kannst du die Routinen dann so:

Delphi-Quellcode:
procedure TMainForm.AnalyzeButtonClick(Sender: TObject);
begin
  WordList.Clear;
  with WebBrowser.Document as IHTMLDocument2 do
  begin
    Analyze(title, 5, WordList);
    Analyze(body.innerText, 1, WordList);
  end;
  WordList.CustomSort(CompareItems);
  ShowRanking(WordList);
end;
Freundliche Grüße vom marabu
Angehängte Dateien
Dateityp: zip wb-analyze_184.zip (2,4 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:59 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