【问题标题】:Comparing two lists/arrays and indexing the location of the difference比较两个列表/数组并索引差异的位置
【发布时间】:2017-06-27 04:34:09
【问题描述】:

我能够比较数组并获取元素的索引,但是这个内置的 Compare-Object 函数返回一个奇怪的值。当我运行此代码时,它返回 -1 的值。

  1. How to compare two arrays are described here
  2. Get index of current item in powershell

这是我的代码。

# compare to arrays

$array1 = @(1,2,3,4,5)
$array2 = @(1,2,7,4,5)

$difference = Compare-Object $array1 $array2

# get the position of the difference in arrays
[array]::IndexOf($array1, $difference)
[array]::IndexOf($array2, $difference)

结果

PS C:\...\2017-06-25> C:\...\2017-06-25\compareArrays.ps1
-1
-1

我将使用它来读取文件并比较它们并告诉我文件中的差异在哪里。

【问题讨论】:

  • 你有没有看过$difference是什么对象类型,它的结构和方法是什么?你可能会发现这些信息很有启发性。试试$difference.GetType() 和$difference | Get-Member。 Get-Help Compare-Object 也可能有用且有趣

标签: arrays powershell


【解决方案1】:

问题是Compare-Object 的输出与您在IndexOf() 中的使用方式不匹配。

Compare-Object $array1 $array2

InputObject SideIndicator
----------- -------------
          7 =>
          3 <=

因此,您正在寻找的是将其拆分为两个单独的数组。一种只在左边匹配,另一种在右边匹配。将Where 方法与Split 一起使用可以轻松完成。

$RightDiffs,$LeftDiffs = $difference.where({$_.SideIndicator -eq "=>"},'Split')

在您的示例中,每个对象只有一个不同,但每个对象可能会有多个对象,因此我们需要遍历每个对象。我们只需要InputObject 属性。

foreach ($LeftDiff in $LeftDiffs.InputObject) {
    [array]::IndexOf($array1, $LeftDiff )
}
foreach ($RightDiff in $RightDiffs.InputObject) {
    [array]::IndexOf($array2, $RightDiff)
}

【讨论】:

    【解决方案2】:

    也许是这样的

    function Compare-Array {
      param(
        [Array] $array1,
        [Array] $array2
      )
      if ( -not (Compare-Object $array1 $array2) ) {
        return -1
      }
      for ( $i = 0; $i -lt $array1.Count; $i++ ) {
        if ( $array1[$i] -eq $array2[$i] ) {
          return $i
        }
      }
      return $array1.Length
    }
    

    如果数组相等或两者之间的第一个差的索引,则返回 -1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多