You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对含数字与字符的年龄范围数组进行排序?

问题描述

我有一个表示年龄范围的字符串数组:

$AgeRanges = ( 
"<1",
"1-4",
"5-9",
"10-14",
"15-19",
"20-24",
"25-29",
"30-34",
"35-39",
"40-44",
"45-49",
"50+"
)

直接用Sort-Object排序后结果不符合预期:

$AgeRanges | Sort-Object
<1
10-14
1-4
15-19
20-24
25-29
30-34
35-39
40-44
45-49
50+
5-9

我试过拆分字符串转整数再排序重组,但最后还是硬编码了列表。现在还有婴幼儿相关的类似年龄范围列表要处理,有没有更优雅的处理方式?比如按规则自动调整顺序,或者支持用户输入后的正确排序?

解决方案

方法1:基于起始年龄的自定义排序

提取每个年龄范围的起始整数作为排序依据,用Sort-Object配合脚本块实现:

$AgeRanges | Sort-Object {
    # 提取起始年龄的数字部分
    $start = $_ -replace '[^\d]', '' | Select-Object -First 1
    # 特殊值处理:<1按0排序,50+按50排序
    if ($_ -eq "<1") { 0 } else { [int]$start }
}

运行后得到正确排序结果:

<1
1-4
5-9
10-14
15-19
20-24
25-29
30-34
35-39
40-44
45-49
50+

方法2:预定义排序映射表

如果年龄范围格式固定,提前定义排序优先级哈希表,按映射值排序,适合婴幼儿细分范围(比如"<1月"、"1-3月"等):

$sortOrder = @{
    "<1" = 0
    "1-4" = 1
    "5-9" = 2
    "10-14" = 3
    "15-19" = 4
    "20-24" = 5
    "25-29" = 6
    "30-34" = 7
    "35-39" = 8
    "40-44" = 9
    "45-49" = 10
    "50+" = 11
}

$AgeRanges | Sort-Object { $sortOrder[$_] }

需要扩展范围时,直接在哈希表里新增键值对即可。

方法3:支持用户输入后的自动排序

先校验用户输入格式,再提取起始年龄排序,兼容<N、N-M、N+三种格式:

# 示例:用户输入多个年龄范围,用逗号分隔
$userInput = Read-Host "请输入年龄范围(用逗号分隔,如<1,1-4,5-9)"
$userAgeRanges = $userInput -split ',' | ForEach-Object { $_.Trim() }

# 排序逻辑
$sortedRanges = $userAgeRanges | Sort-Object {
    switch -Regex ($_) {
        '^<(\d+)' { [int]$matches[1] - 1 } # <N按N-1排序,比如<1对应0
        '^(\d+)-' { [int]$matches[1] }     # N-M按起始数N排序
        '^(\d+)\+' { [int]$matches[1] }    # N+按N排序
        default { [int]::MaxValue }        # 格式错误的放最后
    }
}

Write-Host "排序后的年龄范围:"
$sortedRanges

内容的提问来源于stack exchange,提问作者Dr. Sicoco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:35:05