我正在寻找一组号码中的下一个可用号码,遇到麻烦。
我的数据集是一个字符串数组,然后将其转换为整数数组。原始数据集可能有重复的数字。
当我尝试找到下一个可用数字时,重复项似乎会导致产生不良结果的问题
$dataset = "0001","0002","0004","0006","2","5"
#Convert our strings to integers
[array]$Used = foreach($number in $dataset) {
try {
[int]::parse($number)
} catch {
Invoke-Expression -Command $number;
}
}
[array]::sort($Used)
$range = 1..10
$Available = compare $range $Used -PassThru
我的结果是:
$Dataset =
0001
0002
0004
0006
2
5
$Used =
1
2
2
4
5
6
注意到$Used
(已排序)表明2
是重复项:
$Available =
2
3
7
8
9
10
最后$Available
将2
列为可用数字,这是错误的。 2
实际上被使用了两次,正确的答案应该是3
。
有什么想法吗?
答案 0 :(得分:1)
此问题之前已经回答:Removing duplicate values from a PowerShell array
很多不错的答案选项,但基本上是:
$Used = $Used | select -uniq
或其他选择
$Used | sort -uniq
答案 1 :(得分:1)
将字符串转换为数字可以通过简单的 cast 来完成:
$dataset = "0001","0002","0004","0006","2","5"
$numbers = [int[]] $dataset
要对这些数字进行排序并消除重复项:
$uniqueSortedNumbers = $numbers | Sort-Object -Unique
要在结果列表中查找第一个可用号码,或者可能在下一个更高的号码中查找:
# Find the first gap in the list of sorted numbers, if any.
$nextAvailableNumber =
Compare-Object -PassThru $uniqueSortedNumbers (1..($uniqueSortedNumbers[-1])) |
Select-Object -First 1
# If there was no gap, use the highest number + 1
if ($null -eq $nextAvailableNumber) {
$nextAvailableNumber = $uniqueSortedNumbers[-1] + 1
}
关于您尝试过的事情:
Compare-Object
列出了两个集合唯一的对象。
由于$used
中有重复项,因此这些重复项也被报告为唯一,因为$range
没有重复项。
使用-PassThru
可以传递唯一值,而不会(明显)区别它们是唯一的输入集合,因此最终您将混合使用每个集合唯一的数字,包括两者($range
唯一的数字和重复的数字,都可以解释您的症状。
通过事先从$used
中删除重复项,可以避免该问题,因为所有唯一值随后都保证仅来自$range
。
答案 2 :(得分:0)
Compare-Object
cmdlet总是使我感到困惑[ blush ],所以我完全避免了它。 [咧嘴]的工作原理是...
[string]
项转换为[int]
项这是代码...
$DataSet = '0001','0002','0004','0006','2','5'
$UsedNumbers = $DataSet.
ForEach({[int]$_}) |
Sort-Object -Unique
$TargetRange = 1..10
$AvailableNumbers = $TargetRange.
Where({
$_ -notin $UsedNumbers
})
$AvailableNumbers
输出...
3
7
8
9
10