ExchangeStringFields(String.s, Index1, Index2, Separator.s)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

ExchangeStringFields(String.s, Index1, Index2, Separator.s)

Beitrag von DarkDragon »

Hallo,

diese Prozedur dient lediglich dazu zwei StringFields auszutauschen:

Code: Alles auswählen

Procedure.s ExchangeStringFields(String.s, Index1, Index2, Separator.s)
  If Index1 > Index2
    c = Index1
    Index1 = Index2
    Index2 = c
  EndIf
  
  m1 = Index1
  m2 = Index2
  While m1 > 1
    x1 = FindString(String, Separator, x1)+1
    m1 - 1
  Wend
  While m2 > 1
    x2 = FindString(String, Separator, x2)+1
    m2 - 1
  Wend
  
  s1 = Len(StringField(String, Index1, Separator))
  s2 = Len(StringField(String, Index2, Separator))
  
  String2.s = Left(String, x1) + StringField(String, Index2, Separator) + Mid(String, x1+s1+1, x2-(x1+s1)-1) + StringField(String, Index1, Separator) + Right(String, Len(String)-(x2+s2-1))
  ProcedureReturn String2
EndProcedure

;Hier ein Beispiel:

Debug ExchangeStringFields("Test1|Test12|Test123", 1, 2, "|")
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

ich wäre ja wirklich sehr froh darüber, wenn du bei einem code für die öffentlichkeit, zumindest die variablen sinngemäß benennen könntest. so könnte man auch trotz fehlender kommentare einen einfachen durchblick finden.

außerdem wird die gültigkeit der parameter nicht überprüft.


edit: geht auch einfacher

Code: Alles auswählen

Procedure$ ExchangeStringFields(String.s, Index1, Index2, Separator.s)
    If StringField(String,Index1,Separator)="" Or StringField(String,Index2,Separator)="" Or Index1<1 Or Index2<1
        ProcedureReturn ""
    EndIf
    
    For i=1 To CountString(String,Separator)+1
        If i=Index1
            Ergebnis.s+StringField(String,Index2,Separator)+Separator
        ElseIf i=Index2
            Ergebnis.s+StringField(String,Index1,Separator)+Separator
        ElseIf StringField(String,i,Separator)
            Ergebnis.s+StringField(String,i,Separator)+Separator
        EndIf
    Next
    If Right(String,1)<>Separator
        ProcedureReturn Left(Ergebnis,Len(Ergebnis)-1)
    Else
        ProcedureReturn Ergebnis
    EndIf
EndProcedure

Debug ExchangeStringFields("Test1|Test12|Test123", 1, 2, "|")
 
Antworten