如何对含数字与字符的年龄范围数组进行排序?
问题描述
我有一个表示年龄范围的字符串数组:
$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
相关产品推荐
相关产品推荐

