vergleichen

  • hi leute!
    ich hab mal wieda eine kleine frage. also ich habe ein script in dem iene liste mit verschiedenen strings ist die strings besthene auf zahlen jeweils durch ein "," oder "/" voneinander getrennt. nun will ich wissen ob man es irgendwie hinbekommen kann, dass die tahl die am heufigsten an erster stelle steht in ein input geschrieben wird.

    thx in voraus ;)

    hier ein beispiel für die striings:

    Code
    23,45,67,23,768,45,878,34,67,34 / 34
    45,23,57,34,789,46,78,345,768,89,34 / 12
  • also aus dem gesamten string. im grunden von jedem string immer die ersten dann die zweiten usw und wie zahl die am häufigsten vorkommt in ein input schreiben ;)

  • @Bigfix: eien zahl ;)

    23,56,78,12,89
    23,78,12,98,89

    hier sollte dann folgendes raus kommen:

    23,78,12,98,89

    also imma die zahl die am meisten vertretten is und wenn jede nur einaml vorhanden is dann die größte.

    • Offizieller Beitrag

    Ansatz:
    - mit StringReplace alle '/' durch ',' ersetzen
    - dann mit StringSplit($str, ',') aufdröseln
    - Array sortieren
    - dann Element für Element durchgehen
    wenn Element = voriges Element dann $tmp +=1
    sonst
    $arTemp[$i][0] = $Element
    $arTemp[$i][1] = $tmp

    Somit hast du im TempArray die Werte und deren Häufigkeit.
    Nach Häufigkeit sortieren - fertig.

    Ist jetzt nicht 100% exakt aber die Richtung stimmt. ;)

  • hier die gui

    hier mal die gui. ;)

    also nur noch einmal um sicher zu gehen es soll aus alles ersten zahlen nur eine ausgewählt werden und in einen input geschrieben werden und gengau so bei dne zweiten dritten usw.

    EDIT: leider musste ich eben feststellen das ich keien ahnug von arrays habe :(. bis zu stringsplit komm ich ja noch mit aba dann...ich bin mir nicht mla sicher ob der anfang richtig is.

    [autoit]

    $list = GUICtrlRead($List1)
    $str1 = StringReplace($list,"/",",")
    StringSplit($str1,",")

    [/autoit]

    2 Mal editiert, zuletzt von .::Mignon::. (28. Oktober 2007 um 00:56)

    • Offizieller Beitrag

    Hier bekommst du aus allen gegebenen Zahlen
    - sortiert nach Häufigkeit (fallend)
    - bei gleicher Häufigkeit, diese sortiert nach Größe (fallend)

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Dim $arTMP[1][2], $count=1
    $str1 = '23,45,67,23,768,45,878,34,67,34 / 34'
    $str2 = '45,23,57,34,789,46,78,345,768,89,34 / 12'

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

    $str = $str1 & $str2
    $str = StringReplace($str, '/', ',')

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

    $arSplit = StringSplit($str, ',')
    _ArrayDelete($arSplit, 0)
    For $i = 0 To UBound($arSplit) -1
    $arSplit[$i] = Number(StringStripWS($arSplit[$i], 8))
    Next
    _ArraySort($arSplit)

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

    For $i = 0 To UBound($arSplit) -1
    If $i < UBound($arSplit)-1 Then
    If $arSplit[$i] = $arSplit[$i+1] Then
    $count += 1
    Else
    ReDim $arTMP[UBound($arTMP)+1][2]
    $arTMP[UBound($arTMP)-1][1] = $arSplit[$i]
    $arTMP[UBound($arTMP)-1][0] = $count
    $count = 1
    EndIf
    Else
    If $count <> 1 Then $count += 1
    ReDim $arTMP[UBound($arTMP)+1][2]
    $arTMP[UBound($arTMP)-1][1] = $arSplit[$i]
    $arTMP[UBound($arTMP)-1][0] = $count
    $count = 1
    EndIf
    Next
    _ArraySort_2ary($arTMP, 0, 1)

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

    _ArrayDisplay($arTMP)

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

    ; $arTMP[$i][0] = Häufigkeit
    ; $arTMP[$i][1] = Wert

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

    ;----------------------------------------------------------------------------------------------------------------------
    ; Function _ArraySort_2ary(ByRef $ARRAY [, $DIM_1ST=0 [, $DESCENDING=0 [$REVERSE=False]]])
    ;
    ; Description sort an 2D-Array 2-ary
    ; BaseIndex is 0
    ; sort the whole array
    ;
    ; Parameter $ARRAY: Array to sort
    ; optional $DIM_1ST: MainSortIndex; 1st Dim. [0] or last occurence in 2nd Dim.[all other values] (default 0)
    ; optional $DESCENDING: Sort ascending[0]/descending[1] (default 0)
    ; optional $REVERSE: Sort 2nd Dimension reverse to 1st Dimension (default False)
    ;
    ; Return Succes -1 ByRef 2-ary sorted Array
    ; Failure 0 set @error
    ; @error = 1 given array is not array
    ; @error = 2 given array has only 1 dimension
    ;
    ; Requirements By using numeric entry, be sure that type is "number" for correct sort
    ; Works with any occurences in 2nd Dimension
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;----------------------------------------------------------------------------------------------------------------------
    Func _ArraySort_2ary(ByRef $ARRAY, $DIM_1ST=0, $DESCENDING=0, $REVERSE=False)
    If ( Not IsArray($ARRAY) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $FIRST = 0, $LAST, $tmpFIRST, $sortYES = 0
    Local $UBound2nd = UBound($ARRAY,2)
    If @error = 2 Then
    SetError(2)
    Return 0
    EndIf
    If $DIM_1ST <> 0 Then $DIM_1ST = $UBound2nd-1
    Local $arTmp[1][$UBound2nd]
    _ArraySort($ARRAY,$DESCENDING,0,0,$UBound2nd,$DIM_1ST)
    If $REVERSE Then
    Switch $DESCENDING
    Case 0
    $DESCENDING = 1
    Case 1
    $DESCENDING = 0
    EndSwitch
    EndIf
    For $u = 0 To $UBound2nd-1
    For $i = 0 To UBound($ARRAY)-1
    If $sortYES = 0 Then
    If $u > 0 Then
    If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) And _
    ( $ARRAY[$i][$u-1] = $ARRAY[$i+1][$u-1] )Then
    $sortYES = 1
    $FIRST = $i
    EndIf
    Else
    If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) Then
    $sortYES = 1
    $FIRST = $i
    EndIf
    EndIf
    ElseIf $sortYES = 1 Then
    If ( $i = UBound($ARRAY)-1 ) Or ( $ARRAY[$i][$u] <> $ARRAY[$i+1][$u] ) Then
    $sortYES = 0
    $LAST = $i +1
    ReDim $arTmp[$LAST-$FIRST][$UBound2nd]
    $tmpFIRST = $FIRST
    For $k = 0 To UBound($arTmp)-1
    For $l = 0 To $UBound2nd-1
    $arTmp[$k][$l] = $ARRAY[$tmpFIRST][$l]
    Next
    $tmpFIRST += 1
    Next
    $tmpFIRST = $FIRST
    Switch $DIM_1ST
    Case 0
    If $u = $UBound2nd-1 Then
    _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$UBound2nd-1)
    Else
    _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$u+1)
    EndIf
    For $k = 0 To UBound($arTmp)-1
    For $l = 1 To $UBound2nd-1
    $ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
    Next
    $tmpFIRST += 1
    Next
    Case $UBound2nd-1
    If $u = $UBound2nd-1 Then
    _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$UBound2nd-1)
    Else
    _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$UBound2nd-1-$u-1)
    EndIf
    For $k = 0 To UBound($arTmp)-1
    For $l = 0 To $UBound2nd-2
    $ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l]
    Next
    $tmpFIRST += 1
    Next
    EndSwitch
    EndIf
    EndIf
    Next
    $sortYES = 0
    Next
    Return -1
    EndFunc ;==>_ArraySort_2ary

    [/autoit]
  • ok danke erst mal bugfix. eine frage hätte ich da denn noch noch kann man dein script auch anwenden wenn sich die anzahl der strings immer erhöht?
    und geht das auch einfacher?

  • oh, ich glaube du hast imma noch nich ganz meine frage verstanden 8|

    es hört sich zumindest so an.

    also ich erkläre einfach noch mal ganz ausführlich ;)

    also ich habe ein programm (siehe beispielbild witer oben) in dem eine list ist dun dort können zahlenketten eingegeben werden. nun will ich gerne das das programm nach klick auf einen button mir berechnet welche zahl (nur die ersten imt ganzen string) am heufigsten vorhanden ist. sollten dann 2 zahlen gleich aufliegen soll die größte gewählt werden und in einen input geschrieben werden. das ganze wird dann wiederholt, jeweils mit den 2ten zahlen aus jeden string mit den dtritten...usw. ;)

    ich hoffe mal das dieses beispiel nun ausreichend war, falls du es doch schon vorher verstanden haben solltest siehe das als eie art auffrüschung^^.

    • Offizieller Beitrag

    Hmm, also ich versteh nicht, was du meinst.

    Schreib es doch mal in Pseudo-Code:
    - nimm erste Zahl String1
    - zähle, wie oft diese Zahl im String1 ist
    - nun nimm erste Zahl String2
    - zähle, wie oft diese Zahl im String2 ist
    - wenn die Anzahl gleich ist, gib die größere von beiden zuerst aus

    Das mal als Bsp. Ich hab nämlich echt keinen Plan, was du nun wirklich willst. ?(

    • Offizieller Beitrag

    Hi,

    meinst du so?

    [autoit]

    #include<Array.au3>
    Global $str1 = '23, 129,45,67,23,768,45,878,34,67,34 / 34,45,23,57,34,789,46,78,345,768,89,34 / 12'
    MsgBox(0, "Am Häufgisten oder bei Gleichheit am Größten ist :", _occurrence($str1))

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

    Func _occurrence($sString)
    Local $splitted = StringRegExp(StringStripWS($sString, 8), '\d+', 3)
    Local $result[UBound($splitted) ][2]
    For $i = 0 To UBound($splitted) - 1
    StringReplace($str1, $splitted[$i], '')
    $result[$i][1] = @extended
    $result[$i][0] = Number($splitted[$i])
    Next
    If $result[0][1] = 1 Then Return _ArrayMax($splitted, 1, 0)
    _ArraySort($result, 1, 0, 0, 2, 1)
    Return $result[0][0]
    EndFunc ;==>_occurrence

    [/autoit]

    So long,

    Mega

  • vom prinzip her richtig nur ich müsstest dann die func ja 7 mal aufrufen da jeder string aus 7 zahlen besteht und ich ja imma nur die paare vergleichen will, sprich imma die ersten zweiten dritten...und das soll dann halb in input geschrieben werdne ich hab für jede gruppe einen also 7 stück^^ ;)

  • ok ich hab mir das mal getestet und hab rausgefunden das die func den ganzen string vergleicht...es soll da aber imma nur die erste zahl aus einen string sein. ;)

    • Offizieller Beitrag
    Zitat

    Original von .::Mignon::.
    @ xeno : ich hab da doch wohl oft genug betont auch schon in vorherigen posts.

    Nun laß mal die Luft raus. Wenn sowohl Xeno als auch ich dir sagen, dass deine Erklärung NICHT ausreichend ist, brauchst du nicht anfangen zu gnatzen.
    Wir sind wahrlich keine Anfänger und versuchen aus jeder noch so vagen Problembeschreibung etwas herauszukitzeln.
    Da dies bei dir nicht das gewünschte Ergebnis bringt, wird wohl deine Problemschilderung eben nicht ausreichen.

  • ok sry. dann versuche is es eben noch einmal mit einem beispel das wohl jeder kennen sollte.l

    stellt euch einmal vor ihr habt ein paar würfel und würfelt nun. beim ersten mal erhaltet ihr 3, beim 2ten mal 6...usw

    wenn ihr fertig seit dann hat ihr eine reiche zahlen (eure ergebnisse)

    z.b. 2,7,1,5,12,34,2

    dann würfelt ihr noch eine runde und das ergebnis hier ist z.b.

    5,12,6,21,7,3,1

    so dan hat man also 2 strings die aus würfelergebnisse bestehen. nun will ich das vergleichen um herauszufinden welche zahl man wahrscheinlich als nächstes würfelt. das das versuche ich indem ich herausfinde welche zahl am häufigsten gewürfelt wurde.

    wa das denn nu einigermaßen verständilich für euch? ich hoffe mal ja ;)