• Hi All

    Ich starte hiermit mal den µit - Juli und hoffe, daß die Aufgabenstellung interessant ist und weiters, daß diese Funktion nicht schon existiert ;)

    Aufgabe:
    Schreibe eine Funktion, welche zählt, wie oft ein Substring in einem String vorkommt!
    _StringInStrCount( "String", "SubString" [, $bSens=False [, $bPartial=False [, $sDelimiter='' [, $bRetType=False]]]])
    String = String in dem gesucht werden soll
    SubString = String nach dem gesucht werden soll
    $bSens = Casesensitive True/False
    (Sollte klar sein)
    $bPartial = Wenn True, dann werden nur die alleinstehenden SubStrings gezählt
    ( True: "Test Testosteron" ; False: "Test Testosteron")
    $sDelimiter = Wenn nicht '' , dann soll der SubString bei diesem Zeichen gesplittet werden und nach allen Teilen gesucht werden.
    (SubString='Test Muster':
    $sDelimiter='' : 'Test Muster Das ist ein Muster und ein Test'
    $sDelimiter=' ' : 'Test Muster Das ist ein Muster und ein Test' (SubString wird in diesem Fall beim Leerzeichen getrennt und nach allen Teilen einzeln gesucht)
    $bRetType = False: Gesammtanzahl wird zurückgegeben; True: ein Array mit den Einzelcounts wird zurückgegeben
    ($aReturn[0] = Anzahl der Einträge, $aReturn[1] = Anzahl des 1 TeilSubStrings ...)

    Wenn SubString leer ist, dann werden alle Zeichen gezählt, mit Ausnahme des Delimiters (Flag3)
    z.B.: SubString='' Flag3=';' => '1234;5678' = 8 Zeichen
    In diesem Fall soll auch bei Array-Rückgabe die Gesammtsumme verwendet werden $aReturn[1]=8

    Ich hoffe die Angaben sind verständlich!

    Bewertet werden Geschwindigkeit und Größe.

    Teilnehmer senden bitte Ihre Funktion an mich per PM.

    lgE

    EDIT:

    TestSuite:

    Spoiler anzeigen
    [autoit]


    $sText = "Und Bund rund Undelete und Fundbüro; Und. und! und? und'" & ' und" ' & "Und" & @LF & "Rund" & @CR & "Rund" & @CRLF & "Rund;" & @CRLF & "Aber Aberglaube labern makaber aber"
    ; -Send -Part +Send -Part +Sens +Part -Sens +Part
    ;und 8 5 11 15
    ;aber 2 1 3 5

    [/autoit] [autoit][/autoit] [autoit]

    _Check(1, _StringInStrCount($sText, "und", False, False, "", False), 8)
    _Check(2, _StringInStrCount($sText, "und", True, False, "", False), 5)
    _Check(3, _StringInStrCount($sText, "und", True, True, "", False), 11)
    _Check(4, _StringInStrCount($sText, "und", False, True, "", False), 15)

    [/autoit] [autoit][/autoit] [autoit]

    _Check(5, _StringInStrCount($sText, "aber", False, False, "", False), 2)
    _Check(6, _StringInStrCount($sText, "aber", True, False, "", False), 1)
    _Check(7, _StringInStrCount($sText, "aber", True, True, "", False), 3)
    _Check(8, _StringInStrCount($sText, "aber", False, True, "", False), 5)

    [/autoit] [autoit][/autoit] [autoit]

    _Check(9, _StringInStrCount($sText, "und;aber", False, False, ";", False), 10)
    _Check(10, _StringInStrCount($sText, "und;aber", True, False, ";", False), 6)
    _Check(11, _StringInStrCount($sText, "und;aber", True, True, ";", False), 14)
    _Check(12, _StringInStrCount($sText, "und;aber", False, True, ";", False), 20)

    [/autoit] [autoit][/autoit] [autoit]

    _Check(13, _StringInStrCount($sText, "und;aber", False, False, ";", True), "2;8;2")
    _Check(14, _StringInStrCount($sText, "und;aber", True, False, ";", True), "2;5;1")
    _Check(15, _StringInStrCount($sText, "und;aber", True, True, ";", True), "2;11;3")
    _Check(16, _StringInStrCount($sText, "und;aber", False, True, ";", True), "2;15;5")

    [/autoit] [autoit][/autoit] [autoit]

    _Check(17, _StringInStrCount($sText, "", False, True, "", False), 119)
    _Check(17, _StringInStrCount($sText, "", False, True, " ", False), 104)

    [/autoit] [autoit][/autoit] [autoit]

    Func _StringInStrCount($sString, $sSubString, $bSens = False, $bPartial = False, $sDelimiter = '', $bRetType = False)
    EndFunc ;==>_StringInStrCount

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Check($i, $j, $k)
    Local $sj = "", $sk = ""
    ConsoleWrite("Test " & $i & ": ")
    Switch StringInStr($k, ";")
    Case False
    If $j = $k Then
    ConsoleWrite(" Richtig: " & @TAB & $j & @LF)
    Else
    ConsoleWrite(" Falsch: " & @TAB & $j & @TAB & " (richtig wäre: " & $k & ")" & @LF)
    EndIf
    Case Else
    $k = StringSplit($k, ";", 2)
    If Not IsArray($j) Then
    ConsoleWrite(" Falsch: " & @TAB & " Rückgabe ist kein Array" & @LF)
    Return
    EndIf
    If UBound($j) <> UBound($k) Then
    For $l = 0 To UBound($j) - 1
    $sj &= " " & $j[$l]
    Next
    For $l = 0 To UBound($k) - 1
    $sk &= " " & $k[$l]
    Next
    ConsoleWrite(" Falsch: " & @TAB & $sj & @TAB & " (richtig wäre: " & $sk & ")" & @LF)
    Return
    EndIf
    Local $bRichtig = True
    For $l = 0 To UBound($j) - 1
    If $j[$l] <> $k[$l] Then $bRichtig = False
    $sj &= " " & $j[$l]
    $sk &= " " & $k[$l]
    Next
    If $bRichtig Then
    ConsoleWrite(" Richtig: " & @TAB & $sk & @LF)
    Else
    ConsoleWrite(" Falsch: " & @TAB & $sj & @TAB & " (richtig wäre: " & $sk & ")" & @LF)
    EndIf
    EndSwitch
    EndFunc ;==>_Check

    [/autoit]
    • Offizieller Beitrag

    Flag3=' ' : 'Test Muster Das ist ein Muster und ein Test' (SubString wird in diesem Fall beim Leerzeichen getrennt und nach allen Teilen einzeln gesucht)


    Das solltest du dann für den Return präzisieren:
    Rückgabe Anzahl
    - für jedes Element einzeln? (Array, delimited String)
    - als Summe für alle Elemente?

    Also ich würde mitmachen.

  • Ich denke, ich mache mit ;)
    Zu Flag3: soll das gesamte Ergebnis oder für jeden Substring das Ergebnis als Array zurückgegeben werden?

    //Edit: Warum hab ich vergessen abzusenden? jetzt hat BugFix das gleiche gepostet...

  • Da hast du recht!

    Dann bräucht ma noch einen Flag4, mit dem sich der Benutzer aussuchen kann, ob er ein Array haben will, oder nicht!

    Weiters fällt mir grad ein:
    Wenn man SubString leer lässt und einen Delimiter definiert (z.B: Leerzeichen), dann sollten alle Zeichen mit Ausnahme des Delimiters gezählt werden.
    Wäre das sinnvoll?

    lgE

  • Kurze Frage:

    Jetzt fängt ja schon der nächte Wettbewerb an. Wo ist den die Auflösung des letzen??

  • Ich mach auch mit ;). War eigentlich schon fertig, aber wenn jetzt noch ein Flag hinzukommt, dann warte ich besser noch ein bischen! :P


    Ich bin auch schon fertig ;) (22 Zeilen incl. Func-EndFunc und allem zusätzlichen aus Post #4)

  • BugFix ,
    das beantwortet sich doch eigentlich von selbst, da es ja ein Flag "Case sensitiv" gibt ;)

    PS: ich traue mich gar nicht mitmachen,
    wenn hier die "Größen" antreten und sogar schon fertig sind ... 8)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • selbe Antwort + Flag 2 (alleinstehend Ja/Nein/) :D
    ich kann Dein Problem nicht nachvollziehen.
    Gibt es denn eine Konstellation die über die Flags nicht abgegriffen wird?

    Edit: Ich glaube, ich mache doch mit...

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    • Offizieller Beitrag

    Das das mit den Flags abgeklärt wird ist klar.
    Ich wollte nur eine Definition von Partialsuche geklärt haben, da es innerhalb der AutoIt-Funktionen dort auch unterschiedliche Suchmethoden gibt:
    1. partial ist, wenn ein Begriff mit dem Suchbegriff beginnt (Test Testosteron)
    2. partial ist, wenn der Begriff den Suchbegriff enthält (test Attest)

    Verstehst du jetzt, was ich meine? ;)

  • ach BugFix,
    ich mag Deine Akrebie. :)

    Ich hätte gesagt partial ist "Teil eines Begriffes". Unabhängig davon, ob am Anfang oder nicht.

    Wenn es denn nur der partielle Teil am Anfang sein soll, kannst Du ja noch ein Flag 5 einfügen.
    (Halte ich aber für übertrieben)

    Natürlich muß das Eukalyptus entscheiden...

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Also ich bin für Methode 2, also der Begriff muß enthalten sein.

    Hier mal eine Testsuite:

    EDIT: Siehe Post 1

    Hab ich mal grob zusammengezimmert...
    Ich hoffe, daß keine Fehler enthalten sind :whistling:

    Falls irgendwelche Beschwerden auftauchen, oder sonstige Wünsche (z.b. doch die andere Partialsuche...),
    dann bin ich gerne bereit das noch zu ändern.
    Schließlich soll die Funktion später doch vernünftig anzuwenden sein! :)

    lgE

  • Bei der aktuellen Testsuite ist Array-Ja ;)

    Wie gesagt, solche Kleinigkeiten können wir noch ändern, damit die bestmögliche Benutzerfreundlichkeit erreicht wird...

    Und vielleicht hat ja jemand Lust einige sinnvollere Strings in die Testsuite einzubauen :D
    Da war ich etwas einfallslos...

    lgE

    • Offizieller Beitrag

    Kann es sein, dass du Flag1 in deiner Testumgebung genau falsch betrachtest? Ich würde sagen: JA :D

    _Check(1, _StringStrCount("test TEST Test TestTest", "Test", False, False, "", False), 5)
    Sensitive = False, Partial=False: ==> Test u. test richtig ==> 3!

    _Check(2, _StringStrCount("test TEST Test TestTest", "Test", True, False, "", False), 3)
    Sensitive =True, Partial=False: ==> Test richtig ==> 1!

    usw.

    Ahh, nochwas:
    _Check(6, _StringStrCount("test TEST Test TestTest", "TEST Test", True, True, " ", False), 2)
    Hier wird ein Leerzeichen als Trenner übergeben, d.h. wir zählen beide Begriffe und bekommen demzufolge auch zwei Ergebnisse: Anzahl_Begriff1-Trenner-Anzahl_Begriff2
    Hast du hier alles zusammengezählt? Dann ergibt das wenig Sinn.