Преобразование массива чисел в ряд - PullRequest
1 голос
/ 29 января 2020

Я спрашивал себя, как легко вы можете преобразовать массив чисел Like = 1,2,3,6,7,8,9,12,13,15 в 1 строку, которая «минимизирует» числа, поэтому Like = "1-3,6-9,12-13,15".

Я, вероятно, слишком обдумываю это, потому что сейчас я не знаю, как я мог бы достичь этого легко.

Моя попытка :

$newArray = ""
$array = 1,2,3,6,7,8,9,12,13,15
$before
Foreach($num in $array){
  If(($num-1) -eq $before){
    # Here Im probably overthinking it because I don't know how I should continue
  }else{
    $before = $num
    $newArray += $num
  }
}

Ответы [ 3 ]

3 голосов
/ 29 января 2020

Это должно сработать, код самоочевиден, надеюсь:

$array  = @( 1,2,3,6,7,8,9,12,13,15 )

$result = "$($array[0])"
$last   = $array[0]

for( $i = 1; $i -lt $array.Length; $i++ ) {

    $current = $array[$i]

    if( $current -eq $last + 1 ) {
        if( !$result.EndsWith('-') ) {
            $result += '-'
        }
    }
    elseif( $result.EndsWith('-') ) {
        $result += "$last,$current"
    }
    else {
        $result += ",$current"
    }
    $last = $current
}

if( $result.EndsWith('-') ) {
    $result += "$last"
}

$result = $result.Trim(',')
$result = '"' + $result.Replace(',', '","') +'"'

$result
2 голосов
/ 29 января 2020

У меня немного другой подход, но он был слишком медленным, чтобы ответить. Вот оно:

$newArray = ""
$array = 1,2,3,6,7,8,9,12,13,15
$i = 0
while($i -lt $array.Length)
{
    $first = $array[$i]
    $last = $array[$i]
    # while the next number is the successor increment last
    while ($array[$i]+1 -eq $array[$i+1] -and ($i -lt $array.Length))
    {
        $last = $array[++$i]
    }
    # if only one in the interval, output that
    if ($first -eq $last)
    {
        $newArray += $first 
    }
    else
    {
        # else output first and last
        $newArray += "$first-$last"
    }
    # don't add the final comma
    if ($i -ne $array.Length-1) 
    {
        $newArray += ","
    }
    $i++
}
$newArray
1 голос
/ 29 января 2020

Вот еще один подход к проблеме. Во-первых, вы можете сгруппировать элементы по индексу в хеш-таблицу, используя index - element в качестве ключа. Во-вторых, вам нужно отсортировать словарь по ключу, а затем собрать строки диапазона, разделенные на "-" в массиве. Наконец, вы можете просто присоединить этот массив к "," и вывести результат.

$array = 1, 2, 3, 6, 7, 8, 9, 12, 13, 15

$ranges = @{ }

for ($i = 0; $i -lt $array.Length; $i++) {
    $key = $i - $array[$i]

    if (-not ($ranges.ContainsKey($key))) {
        $ranges[$key] = @()
    }

    $ranges[$key] += $array[$i]
}

$sequences = @()

$ranges.GetEnumerator() | Sort-Object -Property Key -Descending | ForEach-Object {
    $sequence = $_.Value
    $start = $sequence[0]

    if ($sequence.Length -gt 1) {
        $end = $sequence[-1]
        $sequences += "$start-$end"
    }
    else {
        $sequences += $start
    }
}

Write-Output ($sequences -join ",")

Вывод:

1-3,6-9,12-13,15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...