在Powershell数组中查找最接近的数值

时间:2014-12-11 11:31:19

标签: arrays powershell-v2.0 windows-7-x64

问:我正在寻找一种更优雅的方法来获得数组中最接近的数字匹配。
我可能在这里有过于复杂的事情

输入

## A given array A where to search in
$a = (16/10),(16/9),(4/3),(5/4),(21/10),(21/9)  

## A given value B which should be searched for in array A (closest match)
$b = 16/11

期望的输出

"Closest value to 16/11 is 4/3"

我目前解决问题的代码

## New array C for the differences of array A - B
$c = $a | %{  [math]::abs($_ - $b) } 

## Measure array C to get lowest value D
$d = $c | measure -Minimum

## Get position E of value D in array C
$e = [array]::IndexOf($c, $d.minimum)

## Position E correlates to array A
echo "Closest value to $b is $($a[$e])

说明

  • 如果哈希表或其他东西更适合
  • ,则不必是数组
  • 我当前的代码输出小数,如1.33333而不是小数4/3。输出分数
  • 会很不错
  • 短代码总是更好

3 个答案:

答案 0 :(得分:1)

$a = (16/10),(16/9),(4/3),(5/4),(21/10),(21/9) 
$b = 16/11
$oldval = $b - $a[0]
$Final = $a[0]
if($oldval -lt 0){$oldval = $oldval * -1}
$a | %{$val = $b - $_
if($val -lt 0 ){$val = $val * -1}
if ($val -lt $oldval){
$oldval = $val
$Final = $_} }
Write-host "$Final is the closest to $b"

答案 1 :(得分:0)

## A given array A where to search in
$a = '16/10','16/9','4/3','5/4','21/10','21/9'

## A given value B which should be searched for in array A (closest match)
$b = '16/11'

$numericArray = ($a | % { Invoke-Expression $_ })
$test = Invoke-Expression $b
$best = 0
$diff = [double]::MaxValue
for ($i = 1; $i -lt $numericArray.count; $i++) {
    $newdiff = [math]::abs($numericArray[$i] - $test)
    if ($newdiff -lt $diff) {
        $diff = $newdiff
        $best = $i
    }
}

"Closest value to $b is $($a[$best])"

这里的最大区别是输入是字符串而不是数字,所以我们可以保留分数。

安全提示:如果输入来自用户,请不要使用此方法,因为将用户生成的字符串传递给Invoke-Expression显然是一个麻烦的方法。

答案 2 :(得分:0)

$diff = $b - $a[0]
$min_index = 0
for ($i = 1; $i -lt $a.count; $i++)
{
   $new_diff = $b - $a[$i]
   if ($new_diff -lt $diff)
   {
      $diff = $new_diff
      $min_index = $i
   }
}

Write-Output "Closest value to $b is $($a[$min_index])"

Powershell不支持分数值...