Jag vill redigera en sträng typ: *3*11***1**hej*1* så att den blir till: *3*11*1*hej*1* Efter att ha tittat på tips-sidan och fått ideer och inspiration löste det sig på detta vis: Har tagit mig friheten att optimera funktionen: Andreas....... Käre peterh, du är inte mer besviken på mig än vad jag själv är. Jag är inte en erfaren programmerare. Jag måste hävda mig själv genom att tracka ned på andra. Jag är inte bättre än någon annan. Jag är nog istället sämre. Måste därför till 150% av min tid försöker att lura alla. Tänk om någon skulle avslöja mig? Nja, det var ju inte så att jag ville att du skulle bli sur eller så. Men Har gjort lite tester och funderat. Att göra funktionen rekursiv är helt onödigt. Det tar faktist längre tid att göra den rekursiv. Det tar inte längre tid att utföra uppgiften med min rekursiva funktion än med de andra. Det går faktiskt fortare. Destor fler konsekutiva tecken som skall filtreras desto snabbare är min metod. Eran metod blir sämre och sämre ju fler konsekutiva tecken det är. Jämförde du med funktionen som du ser i mitt senaste inlägg? Gjorde följande test: Ja Andreas nu har du fel...... Får be så hemskt mycket om ursäkt tänkte helt hel.... :O) Denna kod är en modifierad variant av din kod. Dock genererar den en Tack för att du låter mig korrigera mitt fel.Redigera sträng problem
Dvs att alla det inte finns 2 * efter varandra, de övriga * behövs ej.
Jag har prövat med instr, instrrev och mid$ utan framgång!!
Nu har jag gått över till att läsa in strängen i en array för att sen redigera den och det klarar jag av.
Går det med instr, instrrev eller mid$ funktioner??Sv: Redigera sträng problem
Public Function Redigera_Sträng(Packet As String)
Dim Pos As Long, Start As String, Sist As String
Do While 1
Pos = InStr(1, Packet, "**", vbTextCompare)
If Pos = 0 Then Exit Do
Start = Mid(Packet, 1, Pos - 1)
Sist = Mid(Packet, Pos + 1)
Packet = Start & Sist
Loop
Redigera_Sträng = Packet
txtRedPaket.Text = Packet
End Function
Tack till den som lagt dit tipset!!!Sv: Redigera sträng problem
Public Function StripDoubleChar(ByVal Text As String, Char As String) As String
Dim Pos As Long
Dim Start As Integer
Dim sTemp As String
Dim sFind As String
Dim iCount As Integer
Start = 1
sTemp = Text
sFind = String(2, Char)
Do
Pos = InStr(Start, sTemp, sFind, vbBinaryCompare)
If Pos Then
Mid$(sTemp, Pos) = Mid$(sTemp, Pos + 1) & " "
iCount = iCount + 1
Start = Pos
Else
Exit Do
End If
Loop
StripDoubleChar = Left$(sTemp, Len(sTemp) - iCount)
End FunctionSv: Redigera sträng problem
Nu blir jag lite besviken på dig. Du har ju varit så säker tidigare på
optimering. Men nu börjar du tappa stinget. Jag har kollat din "optimerade"
variant av mike's kod. Följande har noterats.
1. Den varianten blir sämre ju fler konsekutiva tecken det finns i
strängen av den sort som skall filtreras bort. Det är ju då man vill
att algoritmen skall vara snabb eftersom den skall vara bra på att
just ta bort dubbla tecken av en viss sort.
2. Den är onödigt stor. En erfaren programmerare borde se att man
löser detta problem effektivast med en rekursiv funktion. (Du är väl
erfaren verkar det som i alla dina inlägg).
Därför kommer jag med mitt förslag till lösning.
Sample ====================================================
Public Function stripDoubleChar(ByVal s As String, ByRef ch As String) As String
stripDoubleChar = Replace(s, "**", "*", 1, -1, vbTextCompare)
If s = stripDoubleChar Then
Exit Function
Else
stripDoubleChar = stripDoubleChar(stripDoubleChar, ch)
End If
End Function
Sample ====================================================
Lyckligtvis var det ju inte din kod som du optimerade så du kanske kan
säga till ditt försvar att du skulle komma med en liknande lösning själv.
/peterhSv: Redigera sträng problem
Och nej, jag tänkte inte använda en rekusiv funktion.
Och du... Tack för att du finns...Sv: Redigera sträng problem
faktum är att många av dina exempel är bra och proffsiga, men det
är väl inte mer än rätt att även du ibland får en formsvacka. Man ser
ofta dig gå in och optimera och ändra andras förslag. Det har väl flera
sidor med sig att göra så. Fortsätt du, det är ju på detta viset vi lär oss,
genom att se hur andra gör. (Dessutom har du ju kryssat i proffs) på
ditt visitkort för VB6.)
Men du erkänn att jag lyckats fint med min stripDoubleChar det kanske
är detta som är skillnaden mellan utbildade och självlärda. De utbildade
har oftast kunskap i hur saker skall lösas, men kanske inte alltid kan
realisera detta för att erfarenheten med kodning är för liten.
De självlärda har inget problem med hackning av kod, men dom kanske
inte alltid kan det smartaste sättet att lösa ett problem på. Det bli en
egen hopkokad soppa som visserligen funkar men kanske inte alltid så
effektivt som den skulle kunna göra.
Lyckligtvis hör jag till den unika skaran som är dels självlärd, men
också utbildad. Vilket medför att jag är enastående säker på
programmering och algoritmer och datastrukturer och sådant.
Så visst är det bra att jag finns.
/peterhSv: Redigera sträng problem
Public Function stripDoubleChar2(Text As String, Char As String) As String
stripDoubleChar2 = Replace(Text, Char & Char, Char, 1, -1, vbTextCompare)
If Text = stripDoubleChar2 Then
Else
stripDoubleChar2 = Replace(Text, Char & Char, Char, 1, -1, vbTextCompare)
End If
End FunctionSv: Redigera sträng problem
Tror du mig inte skall jag visa med exempel säg bara till.
De tester jag gjorde på min dator var med en strän som slumpades fram som var ca 32 kb stor och innehåller ca 40% "*". Min rekursiva variant var ca 100 gånger snabbare än era loopar.
/PeterhSv: Redigera sträng problem
Det är din funktion fast inte rekursiv. Den gör det operationer din rekursiva funktion gör. Eftersom den max utförs två gånger och det är det kommer ett ojämt antal * efter varandra...
Eller har jag fel???Sv: Redigera sträng problem
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim sTemp As String
Dim Start As Long
Dim sReturn As String
Dim Index As Integer
sTemp = GenText()
Start = GetTickCount()
For Index = 1 To 10
sReturn = stripDoubleChar(sTemp, "*")
Next
Debug.Print "stripDoubleChar: " & GetTickCount() - Start
Start = GetTickCount()
For Index = 1 To 10
sReturn = stripDoubleChar(sTemp, "*")
Next
Debug.Print "stripDoubleChar: " & GetTickCount() - Start
Start = GetTickCount()
For Index = 1 To 10
sReturn = stripDoubleChar(sTemp, "*")
Next
Debug.Print "stripDoubleChar: " & GetTickCount() - Start
Start = GetTickCount()
For Index = 1 To 10
sReturn = stripDoubleChar2(sTemp, "*")
Next
Debug.Print "stripDoubleChar2: " & GetTickCount() - Start
Start = GetTickCount()
For Index = 1 To 10
sReturn = stripDoubleChar2(sTemp, "*")
Next
Debug.Print "stripDoubleChar2: " & GetTickCount() - Start
Start = GetTickCount()
For Index = 1 To 10
sReturn = stripDoubleChar2(sTemp, "*")
Next
Debug.Print "stripDoubleChar2: " & GetTickCount() - Start
End Sub
Public Function stripDoubleChar(ByVal s As String, ByRef ch As String) As String
stripDoubleChar = Replace(s, "**", "*", 1, -1, vbTextCompare)
If s = stripDoubleChar Then
Exit Function
Else
stripDoubleChar = stripDoubleChar(stripDoubleChar, ch)
End If
End Function
Public Function stripDoubleChar2(Text As String, Char As String) As String
stripDoubleChar2 = Replace(Text, Char & Char, Char, 1, -1, vbTextCompare)
If Text = stripDoubleChar2 Then
Else
stripDoubleChar2 = Replace(Text, Char & Char, Char, 1, -1, vbTextCompare)
End If
End Function
Private Function GenText() As String
Dim Index As Integer
GenText = Space(32000)
For Index = 1 To 32000
If Int(Rnd * 5) < 2 Then
Mid$(GenText, Index, 1) = "*"
Else
Mid$(GenText, Index, 1) = "a"
End If
Next
End Function
Och får resultatet:
stripDoubleChar: 791
stripDoubleChar: 771
stripDoubleChar: 772
stripDoubleChar2: 570
stripDoubleChar2: 571
stripDoubleChar2: 581
Man förlorar på att göra funktionen rekursiv.
Håller du inte med mig? Har jag fel? Är jag dum?
(Jag är bäst) :O)Sv: Redigera sträng problem
Du är ute och cyklar nåt alldeles enormt.
1. Varför anropar du min rekursiva funktion 10 gånger i en loop ??
Det enda som måste göras är att anropa funktionen och när den är
klar så har du en sträng där det inte fins någon ** kvar.
2. Jag noterar att din funktion också anropas 10 gånger i en loop !!
Trots detta kan det hända att du har ** kvar i din sträng. För vad
händer då du har en startsträng med fler än 10 * efter varandra ??
I mitt nästa inlägg kommer jag visa en totalt korrekt jämförelse mellan
de båda funktionerna.
/peterhSv: Redigera sträng problem
Vilken tur att du finns och inte tar illa upp av mina hemska påhopp... :O)Sv: Redigera sträng problem
hel del utskrifter som jag vill bespara detta forum. Men kom igen och fixxa
din funktion så den fungerar annars kan vi inte jämföra.
Sample Code ====================================
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim sTemp As String
Dim start As Single
Dim tid As Single
Dim sReturn1 As String
Dim sReturn2 As String
Dim index As Integer
Dim antalTest As Integer
Dim p As Integer
Dim s As Integer
Dim dubbeltecken As Boolean
For antalTest = 1 To 4
sTemp = GenText(antalTest)
Debug.Print
Debug.Print
Debug.Print "====== STARTAR TEST " & antalTest & " ======"
Debug.Print
Debug.Print "> Rekursiv funktion testas på en sträng som är " & Len(sTemp) & " tecken lång"
start = GetTickCount()
sReturn1 = stripDoubleChar(sTemp, "*")
tid = GetTickCount() - start
Debug.Print "> Det tog " & tid & " ms att klara biffen."
Debug.Print "> Resultatsträngen är " & Len(sReturn1) & " tecken lång"
Debug.Print
Debug.Print "> Icke rekursiv funktion testas på en sträng som är " & Len(sTemp) & " tecken lång"
start = GetTickCount()
sReturn2 = stripDoubleChar2(sTemp, "*")
tid = GetTickCount() - start
Debug.Print "> Det tog " & tid & " ms att klara biffen."
Debug.Print "> Resultatsträngen är " & Len(sReturn2) & " tecken lång"
Debug.Print
Debug.Print "> Det är " & Str(sReturn1 = sReturn2) & " att retursträngarna är lika"
Debug.Print
If sReturn1 <> sReturn2 Then
Debug.Print "> Analyserar resultatet av rekursiv funktion........"
p = 0
p = InStr(1, sReturn1, "**", vbTextCompare)
If p = 0 Then
Debug.Print "> Den rekursiva funktionen löste uppgiften inga ** finns kvar"
Else
Debug.Print "> Den rekursiva funktionen löste inte uppgiften....."
p = 0
Debug.Print "> Fel hittades på följande positioner i strängen: ";
Do
p = InStr(p + 1, sReturn1, "**", vbTextCompare)
If p <> 0 Then Debug.Print p;
Loop Until p = 0
End If
Debug.Print
Debug.Print "> Analyserar resultatet av icke rekursiv funktion........"
p = 0
p = InStr(1, sReturn2, "**", vbTextCompare)
If p = 0 Then
Debug.Print "> Den icke rekursiva funktionen löste uppgiften....."
Else
Debug.Print "> Den icke rekursiva funktionen löste inte uppgiften....."
p = 0
Debug.Print "> Fel hittades på följande positioner i strängen: ";
Do
p = InStr(p + 1, sReturn2, "**", vbTextCompare)
If p <> 0 Then Debug.Print p;
Loop Until p = 0
End If
End If
Next antalTest
End Sub
Public Function stripDoubleChar(ByVal s As String, ByRef ch As String) As String
stripDoubleChar = Replace(s, "**", "*", 1, -1, vbTextCompare)
If s = stripDoubleChar Then
Exit Function
Else
stripDoubleChar = stripDoubleChar(stripDoubleChar, ch)
End If
End Function
Public Function stripDoubleChar2(Text As String, Char As String) As String
stripDoubleChar2 = Replace(Text, Char & Char, Char, 1, -1, vbTextCompare)
If Text = stripDoubleChar2 Then
Else
stripDoubleChar2 = Replace(Text, Char & Char, Char, 1, -1, vbTextCompare)
End If
End Function
Private Function GenText(i As Integer) As String
Dim index As Integer
GenText = Space(32000)
For index = 1 To 32000
If Int(Rnd * 5) < i Then
Mid$(GenText, index, 1) = "*"
Else
Mid$(GenText, index, 1) = "a"
End If
Next
End Function
Sample Code ====================================
/peterhSv: Redigera sträng problem
här är en funktion som inte är rekursiv:
Public Function stripDoubleChar2(Text As String, Char As String) As String
Dim sTemp As String
Dim sFind As String
sFind = Char & Char
stripDoubleChar2 = Text
Do
sTemp = stripDoubleChar2
stripDoubleChar2 = Replace(stripDoubleChar2, sFind, Char, 1, -1, vbTextCompare)
Loop Until sTemp = stripDoubleChar2
End Function
Tjuv körde ditt test... Den är lite snabbar än den rekursiva funktionen. men inte mycket...