"Top 3" aus Array ermitteln...

Anfängerfragen zum Programmieren mit PureBasic.
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

"Top 3" aus Array ermitteln...

Beitrag von Hermann »

Hallo zusammen....

ich stehe ein wenig auf dem Schlauch....... Anfänger halt.......

Also ... ich habe ein Array mit n Feldern :

DIM variable.s (n)

Diese habe ich mit Werten gefüllt....... zum Teil kommen Einträge (gewollt) mehrfach vor....

Nun möchte ich feststellen welcher Eintrag am häufigsten, 2häufigsten und 3häufigsten vorkommt.........

Hat jemand einen Tipp für mich ?

Danke im voraus...... Hermann
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Mit

SortArray(ArrayName(), Optionen [, Start, Ende])

sortieren,
und dann mit einem

For

Next

dur alle Elemente gehen.

Nun machst du eine Linked List bei der du immer ein neues Element hinzufügst wenn du was neues gefunden hast.

zB:

Code: Alles auswählen



Structure Egb
  Val.l
  Anzahl.l
EndStructure

NewList Ergeb.Egb()
Dim Vals(100)

For t = 0 To 100
  Vals(t)=Random(9)+1
Next

SortArray(Vals(), 0)


For t = 0 To 100
  If OldVal<>Vals(t)
    OldVal=Vals(t)
    AddElement(Ergeb())
    Ergeb()\Val=Vals(t)      
  EndIf
  
  Ergeb()\Anzahl+1
Next

SortStructuredList(Ergeb(),1,OffsetOf(Egb\Anzahl),#PB_Sort_Long)

ForEach Ergeb()
  Debug "Es gibt "+Str(Ergeb()\Anzahl)+" mal die Nummer "+Str(Ergeb()\Val)+"."
Next

Zuletzt geändert von Konne am 19.10.2006 16:48, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

soll es in der ursprünglichen reihenfolge bleiben?

was für werte kommen denn vor?

wenn es z.b. nur 100 verschiedene werte gibt, wäre ein kontrollarray die einfachste lösung...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

erstmal ein dankeschön an dieser Stelle......

Also.... in den Array kommen diverse Werte ( in diesem Fall Haltestellennamen ) die ich vorher aus einer Datenbank auslese vor.... unsortiert....

Nun will ich feststellen welche 3 Haltestellen am meisten aufgeführt werden...... somit ist der NAme ( alphabetisch ) zur Ausgabe egal..... ich brauche halt nur die 3 häufigsten Werte....

Ich glaube ich muß mich wohl etwas intensiever mit Strukturen etc befassen......... lach......
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

gut.
du kannst jetzt ein zweites array anlegen, in dem du alle namen der reihe nach aufführst.
dabei ist die ordnung egal, aber es muss jeder name genau einmal drinstehn.
ein drittes array machst du numerisch als zählarray.

jetzt gehst du deine komplette liste durch (die ursprüngliche)
bei jedem einzelnen eintrag gehst du das haltestellenverzeichnis (2.Array) durch,
und wenn der name übereinstimmt, erhöhst du der zähler im dritten array.

nachher kannst du direkt aus dem zählarray lesen, wieoft welche haltestelle vorkommt,
und den namen hast du im 2.Array an demselben index.

...das 2te und 3te Array könntest du natürlich auch in ein einziges strukturiertes packen,
wo die struktur aus einem string und einem zähler besteht.
dann kannst du das nachher noch nach zähler sortieren,
um es so in die reihenfolge der häufigkeit zu bringen.

das meinte ich mit kontrollarray, das ist imho die einfachste lösung,
wenn die menge an verschiedenen werten nicht allzu groß ist.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

Ich danke erstmal für die Denkanstöße.......... mal sehen ob ich es umsetzen kann...... lach....... wenn nicht nerve ich noch mal...... aber erstmal danke
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

Ich bin es noch mal......

soweit habe ich es umsetzen können...... hier mal den Quellcode:

Code: Alles auswählen

; in der Variablen "zaehlertaxi" steht die Anzahl der Datensätze aus denen die Top 3 ermittelt werden soll
; in dem Arry "taxi_haltestelle(n)" jeweils ein Name der Haltestelle, dieser NAme kommt z.T. mehrfach vor

  Dim liste.s(zaehlertaxi)
  listenzaehler=1
  For i = 1 To zaehlertaxi
    ja=0
    For ii = 1 To listenzaehler
      If liste.s(ii) = taxi_haltestelle(i)
        ja=1
      EndIf 
    Next
    If ja=0
      liste.s(listenzaehler) = taxi_haltestelle(i)
      listenzaehler = listenzaehler +1
    EndIf
    ii = ii+1
  Next
  listenzaehler=listenzaehler-1
 
  
  Dim liste2(listenzaehler)
  For i = 1 To zaehlertaxi
    For ii = 1 To listenzaehler
      If taxi_haltestelle(i) = liste(ii)
        liste2(ii) = liste2(ii)+1
      EndIf
    Next 
  Next
  

; hier nun das Problem........
; es sollen die 3 häufigsten Haltestellen mit der Anzahl ermittelt werden und den Variablen top1 bis 3 sowie top1s bis 3 zugeteilt werden....

  top1=0
  top1s.s=" "
  top2=0
  top2s.s=" "
  top3=0
  top3s.s=" "
  
  For i = 1 To listenzaehler
    If liste2(i) > top1
      top1=liste2(i)
      top1s=taxi_haltestelle(i)
    EndIf
  Next
  For i = 1 To listenzaehler
    If liste2(i) > top2 And liste2(i)<top1
      top2=liste2(i)
      top2s=taxi_haltestelle(i)
    EndIf
  Next
  For i = 1 To listenzaehler
    If liste2(i) > top3 And liste2(i)<top2
      top3=liste2(i)
      top3s=taxi_haltestelle(i)
    EndIf
  Next
  MessageRequester("test",top1s.s+"    "+Str(top1))
  MessageRequester("test",top2s.s+"    "+Str(top2))
  MessageRequester("test",top3s.s+"    "+Str(top3))
  

Bitte........ erschlagt mich nicht wegen unsauberer Programierung..... lächel........

Das Problem ist nun folgendes.......
bei obrigem Beispiel werden Haltestellen die gleich oft vorkommen unterschlagen....... es findet also keine reale Top 3 Auswertung statt.....

Jemand eine Idee ??

Danke im voraus
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Code tut net wegen dem nicht dimensioierten array.
Wenn du einen code postest er tu hilft man dir auch gernener ;)
Hermann
Beiträge: 31
Registriert: 09.09.2004 23:01
Wohnort: Willich

Beitrag von Hermann »

Esrt mal danke für die Antwort......... wenn ich nicht wüßte das der Code funktoniert würde mir deine Antwort echt hilfreich sein............ lächel.......

Er ist ein Auszug aus dem gesamten Code......... ich glaube das ich alles relevante reingeschrieben habe ...... ich will ja auch keine fertige Lösung sondern nur einen Lösungsansatz....... und........ es geht sich heirbei um die Sortierung in die Top3........

Trotzdem Danke......... ich erkenne den guten Willen.... lächel
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Hey-> pimp your Selbstvertrauen, nutze Smileys und Absätze- und schweige nicht so schüchtern mit den Punkten vor dich hin <) :allright:

Und nerven tust du bestimmt nicht- wir freuen uns immer über Leute, die sich mit Programmierung beschäftigen.
In dem Sinne- mach weiter so, und sry, dass ich mich gerade nicht deines Problemes annehmen kann, da Zeitmangel..

Ich wollte das nur mal gesagt haben...

Gr33tz
Tafkadasom2k5
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Antworten