Sortieren nach 2 Werten

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

regaa

Betreff: Sortieren nach 2 Werten

BeitragDo, Apr 15, 2004 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Also bisher hab ich folgendes Code für das Abwärts sortieren einer bestimmten variable verwendet:

Code: [AUSKLAPPEN]

For t\atext.atext= Each atext
      If max_y>t\atext\y
         Insert t\atext Before Before t\atext
         If t\atext<> First atext
            t\atext.atext=Before t\atext
         EndIf
      EndIf
      max_y=t\atext\y
   Next


Und das funzt auch gut, ob es schnell ist , ist ne andere Sache, aber wie bekomm ich es hin nach 2 Werten zu sortieren? Also, z.B: nach nachnake und wenn dieser gleich ist auch noch nach vorname? Wie muss ich das erweitern? Schon mal Danke an alle.
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

Omenaton_2

BeitragFr, Apr 16, 2004 8:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt bestimmt viele Möglichkeiten.

Wenn der untersuchte Name 1 nicht kleiner und nicht größer, sondern gleich ist als der Vergleich, dann vergleichst du auch die zwei 2.Namen und entscheidest so, ob der Name davor oder danach gesetzt werden soll.

regaa

BeitragFr, Apr 16, 2004 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, das hab ich mir auch überlegt, aber da es gestern so spät war, hab ich mir gedacht das ins Forum zu posten in der Hoffnung einen fertigen Code zu kriegen Laughing .
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

regaa

BeitragFr, Apr 16, 2004 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Sodale, nu bin ich zu Hause und hab folgenden Code vor mir der nicht wirklich funktioniert:

Code: [AUSKLAPPEN]

For t\atext.atext= Each atext
      If max_y>t\atext\y
         Insert t\atext Before Before t\atext
         If t\atext<> First atext
            t\atext.atext=Before t\atext
         EndIf
         DebugLog "SortY"
      EndIf
      
      
      ; Nach dem 2ten Wert sortieren
      If max_y=t\atext\y
         If max_x>t\atext\x
            Insert t\atext Before Before t\atext
            If t\atext<> First atext
               t\atext.atext=Before t\atext
            EndIf
            DebugLog "SortX "+max_x+" "+t\atext\x
         EndIf
         max_x=t\atext\x
      EndIf
      max_y=t\atext\y
      ;DebugLog "Sort"+Rnd(1,10)
   Next



Und meine Frage ist wie ich das anders machen soll? So wie es da steht erzeugt es eine endlosschleife, aus mir unlogischen Gründen, ûnd falls ich die Selektion des letzten objekts rausnehme werden folglich nicht alle durchgenommen. Hoffe ihr könnt's lösen.
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, Apr 16, 2004 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Jo, das hab ich mir auch überlegt, aber da es gestern so spät war, hab ich mir gedacht das ins Forum zu posten in der Hoffnung einen fertigen Code zu kriegen

Naja, weils kompliziert ist, will mal nicht so sein! Very Happy
ich habe mir kürzlich einen Sortalgo für Types gecoded und ein bischen erweitert in deinem Sinne, mußte halt nur abändern!

Mit Test-Daten zum probieren :Code: [AUSKLAPPEN]
Graphics 640,480,16,2
SetBuffer BackBuffer ()

Type Namen   Field NN$,VN$ End Type
   For t= 0 To 15
      Namen.Namen = New Namen
      Read Namen\NN$
      Read Namen\VN$
   Next
zeige(10)
Insert_sort_Type_II()
zeige(300)
WaitKey
End

Function Insert_sort_Type_II()
For Namen.Namen  = Each Namen: gs = gs+1:Next 
bs = 1
Repeat
   Namen.Namen = Last Namen
   Insert Namen Before First Namen
   Namen.Namen = First Namen
   NN$ = Namen\NN$
   VN_1$= Namen\VN$
   X = 1
   bs = bs + 1
   Repeat
      If bs = x Then Exit
      Namen.Namen = After (Namen)
      X = X + 1
      If NN > Namen\NN$ Then
        Insert Namen Before Before Namen
         Namen.Namen = After (Namen)
      Else
         If NN = Namen\NN$ Then
            If Namen\VN$ < VN_1$
               Insert Namen Before Before Namen
               Namen.Namen = After (Namen)
            End If
         EndIf
      End If
   Forever
Until gs = bs
End Function



Function zeige(x)
For q.Namen = Each Namen
c=c +15
Text x+10, 10+c, q\NN$
Text x+100,10+c, q\VN$
Next
Flip
End Function


Data "Rallimen","Ralf","Möller","Ralf","Möller","001","Möller","215","Möller","201"
Data "Rallimen","001","Möller","456","Rallimen","456","Möller","215","Möller","013"
Data "Möller","007","Rallimen","007","Rallimen","333","Rallimen","005","Rallimen","333"
Data "Rallimen","00x"

Sortiert das ganze Typefeld
Vielleicht kannste es ja gebrauchen!
PS:wer was schnelleres hat ..... her damit!!!
[BB2D | BB3D | BB+]

regaa

BeitragFr, Apr 16, 2004 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
nach 3 Stunden Laughing , bin ich zu folgender funktionierender Lösung gekommen:

Code: [AUSKLAPPEN]

Type typ
Field wert1%
Field wert2$
End Type

For i=0 To 15
   t.typ= New typ
   t\wert1=Rnd(1,3)
   t\wert2=Chr$(Rnd(60,90))
Next

bubble_sort_two_values()
Function bubble_sort_two_values()
   Local Int_wert%=0
   Local Ende=False
   Local Ende_i%=0
   Local String_wert$
   Local gleicher_wert%
   
   While Ende=False
      Ende_i=0
      Int_wert=0
      For t.typ= Each typ
         If Int_wert>t\wert1
            Insert t.typ Before Before t.typ
            If t.typ<>First typ
               t.typ=Before t.typ
            EndIf
            Ende_i=Ende_i+1
         EndIf
         
         Int_wert=t\wert1
      Next
      If Ende_i=0 Then Ende=True
   Wend
   Ende=False
   
   
   
   While Ende=False
      Ende_i=0
      String_wert=""
      Int_wert=0
      
      For t.typ=Each typ
         If gleicher_wert=t\wert1
            If String_wert>t\wert2
               Insert t.typ Before Before t.typ
               If t.typ<> First typ
                  t.typ=Before t.typ
               EndIf
               Ende_i=Ende_i+1
            EndIf
            String_wert=t\wert2
         EndIf

         Int_wert=t\wert1
         If Int_wert<>t\wert1
            gleicher_wert=t\wert1
         EndIf
         
         
      Next
      If Ende_i=0 Then Ende=True
   Wend
End Function


For t.typ=Each typ
   Print t\wert1+" "+t\wert2
Next
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragFr, Apr 16, 2004 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht, aber irgendwie geht die nicht?!
1N
1I
1C
1Y

müste doch so ausehen
1C
1I
1N
1Y
[BB2D | BB3D | BB+]

regaa

BeitragFr, Apr 16, 2004 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
im Nachhinein, hab ich auch gemerkt das wohl irgendwo Fehler sind, aber während des testes, kam nicht einmal ein falscher Wert vor, hmm Confused dann geh ich mal weiter proggen Crying or Very sad
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net
 

dubitat

BeitragFr, Apr 16, 2004 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
warum prüfst du es nicht so:

Code: [AUSKLAPPEN]
if nachname = nachname1 then vergleiche vorname



das wäre doch sinnvoll oder?
Erare humanum est - Irren ist Menschlich

regaa

BeitragFr, Apr 16, 2004 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
genau da bin ich grad dran, nur funktioniert das ganze irgendwie imer noch nicht Crying or Very sad .
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

regaa

BeitragFr, Apr 16, 2004 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich meine es gelöst zu haben , probiert des mal bitte aus.

Code: [AUSKLAPPEN]

Type typ
Field wert1%
Field wert2$
End Type

SeedRnd(MilliSecs())
For i=0 To 15
   t.typ= New typ
   t\wert1=Rnd(1,5)
   t\wert2=Chr$(Rnd(60,90))
Next

DebugLog "Vorher"
For t.typ=Each typ
   DebugLog t\wert1+" "+t\wert2
Next
DebugLog "Nachher"

bubble_sort_two_values()
Function bubble_sort_two_values()
   Local Int_wert%=0
   Local Ende=False
   Local Ende_i%=0
   Local String_wert$
   Local gleicher_wert%
   Local anz_untersch=0
   Local arr_unter[10000]
   
   While Ende=False
      Ende_i=0
      Int_wert=0
      anz_untersch=0

      For i=0 To 10000
         arr_unter[i]=0
      Next

      For t.typ= Each typ
         If Int_wert>t\wert1
            Insert t.typ Before Before t.typ
            If t.typ<>First typ
               t.typ=Before t.typ
            EndIf
            Ende_i=Ende_i+1
         EndIf

         If Int_wert<>t\wert1
            arr_unter[anz_untersch]=t\wert1
            anz_untersch=anz_untersch+1
         EndIf
         
         Int_wert=t\wert1
      Next
      If Ende_i=0 Then Ende=True
   Wend

   For i=0 To anz_untersch-1;-1
      Ende=False   
      While Ende=False
         Ende_i=0
         t.typ=First typ
         String_wert=t\wert2
         Int_wert=0
         
         For t.typ=Each typ
               If String_wert>t\wert2 And Int_wert=arr_unter[i] And t\wert1=arr_unter[i]
                  Insert t.typ Before Before t.typ
                  If t.typ<> First typ
                     t.typ=Before t.typ
                  EndIf
                  Ende_i=Ende_i+1
               EndIf
               
            String_wert=t\wert2
            Int_wert=t\wert1
         Next
         If Ende_i=0 Then Ende=True
      Wend
   Next
   
            
   
End Function


For t.typ=Each typ
   DebugLog t\wert1+" "+t\wert2
Next
8)
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group