Arraywerte als Text zusammenfassen

  • Hallo,
    Kann mich vielleicht jemand helfen mit dieses anscheinend simples Problem, krieg es aber nicht hin... :(

    Ich habe ein 1D array namens $samplenum und dieses enthält in index 1 bis 21 diese Werte:
    187, 190, 191, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 221, 222, 224, 228, 230, 231, 232, 237, 239
    Jetzt möchte ich damit einen Text ausgeben mit MsgBox der lautet:
    "These samples are omitted: 187, 190, 191, 206 to 215, 221, 222, 224, 228, 230 to 232, 237, 239"

    Also, wie kann ich eine Schleife machen die mehr als zwei aufeinander folgenden Werte zusammenfasst ?

    Programmieren ist ein bisschen Wissenschaft und viel Spass! :)

    Einmal editiert, zuletzt von Katrijn (5. Januar 2014 um 17:05)

  • Hi,
    sowas vielleicht?

    [autoit]

    Global $aNumbers[23] = [22, 187, 190, 191, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 221, 222, 224, 228, 230, 231, 232, 237, 239]
    Global $sOutput = "These samples are omitted: "
    For $i = 1 To $aNumbers[0]
    If $i = 1 Then
    $sOutput = $sOutput & $aNumbers[$i]
    Else
    $sOutput = $sOutput & ", " & $aNumbers[$i]
    EndIf
    Next
    ConsoleWrite($sOutput & @CRLF)

    [/autoit]

    Stimmt, ist Mist.

  • So z.B sollte es gehen:

    [autoit]


    Global $Array[23] = [22, 187, 190, 191, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 221, 222, 224, 228, 230, 231, 232, 237, 239]
    $text = ""
    For $i = 0 to (UBound($Array)-1)
    $text &= $Array[$i] & ", "
    Next
    $text = StringLeft($text,StringLen($text)-2)
    MsgBox(0,"Titel","These samples are omitted: "&$text)

    [/autoit]

    Edit: water war da wohl schneller :D

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

    2 Mal editiert, zuletzt von PuReIroNie (4. Januar 2014 um 13:03)

  • Bevor man irgendwelche lustigen Schleifen programmiert, sollte man vielleicht erstmal klären wie die Daten überhaupt ausgewählt werden sollen. Ich sehe jedenfalls in der Beispielausgabe im ersten Posting noch kein System das den Einsatz einer intelligenten Schleife erlauben würde.


    Also @ Katrijn : Wie sollen die Blöcke ausgewählt werden? Wie groß sollen die Blöcke sein? Welches System steckt dahinter?

    Edit: Kommt davon wenn man nicht richtig liest...

    Einmal editiert, zuletzt von misterspeed (4. Januar 2014 um 14:05)

  • Aus dem Beispiel geht doch genau hervor, dass mehr als 2 aufeinanderfolgende Zahlen zu einem Block zusammengefasst werden sollen.

    Code
    190, 191    <---  nicht mehr als 2 Zahlen
    206 to 215  <---  mehr als 2 aufeinanderfolgende Zahlen

    Edit:

    meine Lösung
    [autoit]

    Local $a[] = [187, 190, 191, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 221, 222, 224, 228, 230, 231, 232, 237, 239]

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

    Local $s = "", $x = 0, $y = 0, $i
    For $i = 0 To UBound($a)-1
    If $x Then
    If ($a[$i] = $x+1) Then
    $x += 1
    Else
    If ($x-$y < 2) Then
    If ($y <> $a[$i-1]) Then
    $s &= ", " & $x & ", " & $a[$i]
    Else
    $s &= ", " & $a[$i]
    EndIf
    Else
    $s &= " to " & $x & ", " & $a[$i]
    EndIf
    $x = $a[$i]
    $y = $x
    EndIf
    Else
    $x = $a[$i]
    $s &= $x
    $y = $x
    EndIf
    Next

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

    ConsoleWrite($s & @CRLF)

    [/autoit]

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (4. Januar 2014 um 13:43)

  • Next try:

    [autoit]

    Global $aNumbers[23] = [22, 187, 190, 191, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 221, 222, 224, 228, 230, 231, 232, 237, 239]
    Global $sComment = "These samples are omitted: "
    Global $sOutput = $sComment
    Global $iStart = $aNumbers[1], $iEnd = $aNumbers[1]
    For $i = 2 To $aNumbers[0]
    If $aNumbers[$i] > $iEnd + 1 Then ; Start of new range
    _WriteResult()
    $iStart = $aNumbers[$i]
    EndIf
    $iEnd = $aNumbers[$i]
    Next
    _WriteResult()
    ConsoleWrite($sOutput & @CRLF)

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

    Func _WriteResult()
    If $iEnd = $iStart Then ; Range consists of only one number
    If $sOutput = $sComment Then
    $sOutput = $sOutput & $iStart
    Else
    $sOutput = $sOutput & ", " & $iStart
    EndIf
    Else
    If $iStart + 1 = $iEnd Then ; Range constists of two consecutive numbers
    If $sOutput = $sComment Then
    $sOutput = $sOutput & ", " & $iStart & ", " & $iEnd
    Else
    $sOutput = $sOutput & ", " & $iStart & ", " & $iEnd
    EndIf
    ElseIf $sOutput = $sComment Then ; Range constists of more than 2 consecutive numbers
    $sOutput = $sOutput & $iStart & " to " & $iEnd
    Else
    $sOutput = $sOutput & ", " & $iStart & " to " & $iEnd
    EndIf
    EndIf
    EndFunc ;==>_WriteResult

    [/autoit]


    Returns:
    These samples are omitted: 187, 190, 191, 206 to 215, 221, 222, 224, 228, 230 to 232, 237, 239

  • so?

    [autoit]

    Global $Array[22] = [187, 190, 191, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 221, 222, 224, 228, 230, 231, 232, 237, 239]
    ReDim $array[UBound($array) + 2] ;array aufbereiten für Suche

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

    $text = "" ;arrayinhalt nach textinhalt
    $delimiter = "" ;Trennzeichen im Text

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

    For $i = 0 To UBound($Array) - 3 ;array durchlaufen
    If $array[$i + 1] = $array[$i] + 1 And $array[$i + 2] = $array[$i] + 2 And $delimiter <> " to " Then ;3 aufeinanderfolgende zahlen gefunden?
    $delimiter = " to " ;dann "to"
    $text &= $array[$i] & $delimiter ;"to" einfügen
    ElseIf $array[$i + 1] <> $array[$i] + 1 Or $delimiter <> " to " Then ;nicht aufeinanderfolgende gefunden
    $delimiter = ", " ;ansonsten Trennzeichen ", "
    $text &= $Array[$i] & $delimiter ;zusammen mit arrayinhalt
    EndIf
    Next
    $text = StringTrimRight($text, 2) ;letztes Komma weg
    ReDim $array[UBound($array) - 2] ;array wiederherstellen

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

    $vorgabe = "187, 190, 191, 206 to 215, 221, 222, 224, 228, 230 to 232, 237, 239"
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $vorg = ' & $vorgabe & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $text = ' & $text & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit]


    //EDIT: kürzer^^

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    7 Mal editiert, zuletzt von Andy (4. Januar 2014 um 14:52)