查找序列中的下一个数字

时间:2019-06-19 21:06:21

标签: powershell

我正在寻找一组号码中的下一个可用号码,遇到麻烦。

我的数据集是一个字符串数组,然后将其转换为整数数组。原始数据集可能有重复的数字。

当我尝试找到下一个可用数字时,重复项似乎会导致产生不良结果的问题

$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

最后$Available2列为可用数字,这是错误的。 2实际上被使用了两次,正确的答案应该是3

有什么想法吗?

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