返回列表 发帖

[问题求助] PowerShell按16进制数的大小排序并获取缺少的最小的16进制数

下面的两个示例, 每行中间是16进制数 我想将这些行,
按其中的16进制数的值由小到大排序,
最后输出缺少最小的16进制数,
如:示例1中, 缺少0x0001, 0x0002 ......, 最小的就是0x0001了, 那就先排序, 再输出0x0001
再如:示例2中, 缺少0x0002, 0x0004 ......, 最小的就是0x0002了, 那就先排序, 再输出0x0002
#示例1
$s = @'
中 0x0003 国
日 0x0006 本
新加 0x000F 坡
南 0x0011 非
美 0x000A 国
澳大 0x0010 利亚
'@
#示例2
$s = @'
中 0x0001 国
日 0x0003 本
新加 0x000F 坡
南 0x0011 非
美 0x000A 国
澳大 0x0010 利亚
'@COPY

$s = @'
中 0x0001 国
日 0x0003 本
新加 0x000F 坡
南 0x0011 非
美 0x000A 国
澳大 0x0010 利亚
'@
$str=($s -replace '(\r\n){2}',"`r`n" -split '\r\n')
[System.Collections.Generic.Dictionary[int,string]]$coll=@{}
$result=($str|sort{[int](($_ -split ' ')[1])})
$result|%{$coll[((($_ -split ' ')[1]))]=$_}
$rs=$result|%{($_ -split ' ')[1]}
$min=$rs[0]
$max=$rs[$rs.Count-1]
$c=0;$min=foreach($i in $min..$max){
    if($coll.Keys -notcontains $i){$i;$c++}
    if($c -gt 0){break}
}
$coll.Add($min,'0x{0:x4}' -f $min)
$coll.ValuesCOPY
不知是不是这个意思呢?

TOP

回复 2# Nsqs


示例一, 期待结果如下:
中 0x0003 国
日 0x0006 本
美 0x000A 国
新加 0x000F 坡
澳大 0x0010 利亚
南 0x0011 非
0x0001

示例二, 期待结果如下:
中 0x0001 国
日 0x0003 本
美 0x000A 国
新加 0x000F 坡
澳大 0x0010 利亚
南 0x0011 非
0x0002

TOP

本帖最后由 Five66 于 2023-9-11 15:42 编辑

没有判断长度(默认为4),缺少以0x0001为准计算
之前想复杂了,已编辑

TOP

回复 3# 小白龙


    你没运行吗?我写的不就是你结果一样吗

TOP

回复 5# Nsqs

不好意思, 刚回复, 试了一下, 结果如下, 不是我想要的结果:

中 0x0001 国

日 0x0003 本

新加 0x000F 坡

南 0x0011 非

美 0x000A 国

澳大 0x0010 利亚
0x0030

TOP

返回列表