862228699 发表于 2024-3-28 20:22:00

怎么让一个数组变成这样

现在数组是:

['a','b','c','c','c','d,'d,'d,'d,'d,'d','e','f','g','g','g','g','g','h']


想能过算法变成

['a','b','ccc','dddddd','e','f','ggggg','h']



意思是只要相邻的是一样的都变成一组。@afan 大佬帮帮我,谢谢:face (1):

怪咖很怪i 发表于 2024-3-28 20:28:15

本帖最后由 怪咖很怪i 于 2024-3-28 20:29 编辑


#include <Array.au3>

Global $arr = ['a','b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
Global $result
Global $temp = $arr

For $i = 1 To UBound($arr) - 1
    If $arr[$i] = $arr[$i - 1] Then
      $temp &= $arr[$i]
    Else
      _ArrayAdd($result, $temp)
      $temp = $arr[$i]
    EndIf
Next
_ArrayAdd($result, $temp)
_ArrayDelete($result, 0) ; 删除第一个空元素
_ArrayDisplay($result)
ConsoleWrite("合并后的结果数组:" & _ArrayToString($result, ",") & @CRLF)

zghwelcome 发表于 2024-3-28 20:51:55




#include <String.au3>
#include <array.au3>
Local $aAry
For $i = 0 To UBound($aAry) - 1
        $aAry[$i] = Chr(Random(97, 122, 1))
Next
;~ _ArrayDisplay($aAry)
Local $oZD = ObjCreate('Scripting.Dictionary')
For $i = 0 To UBound($aAry) - 1
        If Not $oZD.Exists($aAry[$i]) Then
                $oZD.add($aAry[$i], 1)
        Else
                $oZD.item($aAry[$i]) = $oZD.item($aAry[$i]) + 1
        EndIf       
Next
Local $aAryOut = $oZD.keys
_ArraySort($aAryOut)
;~ _ArrayDisplay($aAryOut)
For $i = 0 To UBound($aAryOut) -1
        $aAryOut[$i] = _StringRepeat($aAryOut[$i],$oZD.item($aAryOut[$i]))
Next       
_ArrayDisplay($aAryOut)


afan 发表于 2024-3-28 20:57:16

#include <Array.au3>
Local $arr = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
Local $aNew = _test($arr)
_ArrayDisplay($aNew)
Func _test($arr)
        If UBound($arr, 0) <> 1 Then Return SetError(1)
        Local $aRt, $sLeft, $iX = -1
        For $ii = 0 To UBound($arr) - 1
                If $arr[$ii] = $sLeft Then
                        $aRt[$iX] &= $arr[$ii]
                Else
                        $sLeft = $arr[$ii]
                        $iX += 1
                        $aRt[$iX] = $arr[$ii]
                EndIf
        Next
        ReDim $aRt[$iX + 1]
        Return $aRt
EndFunc   ;==>_test

862228699 发表于 2024-3-28 21:56:08

感谢各位了。。。谢谢

绿色风 发表于 2024-3-29 01:32:19

我也凑个热闹

#include <array.au3>
Local $arr = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
Local $out,$temp
For $i = 0 To UBound($arr)-1
        If StringCompare($arr[$i],$temp)= 0 Then
                $out &= $arr[$i]
        Else
                $out &=','&$arr[$i]
        EndIf                
        $temp = $arr[$i]
Next
$out = StringSplit(StringTrimLeft($out,1),",",2)
_ArrayDisplay($out)

Yashin 发表于 2024-3-29 09:36:17

试着用正则处理,用标志位 $STR_REGEXPARRAYGLOBALMATCH (3) 只能拿到一个字符,用 $STR_REGEXPARRAYGLOBALFULLMATCH (4) 就可以了,如果能直接分割出来就好了

#include <Array.au3>
Local $arr = ['a', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'd', 'e', 'f', 'g', 'g', 'g', 'g', 'g', 'h']
Local $sArr = _ArrayToString($arr, '')
Local $aRet = StringRegExp($sArr, '(.)\1{0,}', 4)

Local $aResult
For $t In $aRet
    _ArrayAdd($aResult, _ArrayExtract($t, 0, 0))
Next

_ArrayDisplay($aResult)

862228699 发表于 2024-3-29 19:22:51

谢谢各位大佬。。。。。。。结贴了。。。

zhang_jf 发表于 2024-4-2 17:14:41

精彩精彩
页: [1]
查看完整版本: 怎么让一个数组变成这样