0

2 つの配列があり、各配列には 2 つのフィールドがあります (たとえば、「商品」と「価格」)。

以下は、私の配列の 1 つでの get-member の結果です (実際には、両方の配列が同じ構造を持っています)。

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
item        NoteProperty System.String field1=computer 
price       NoteProperty System.String field2=2000     

配列 $shopB にアイテムが見つからない場合、配列 $shopA でアイテムを見つける必要があります。不足しているアイテムを見つけるために 2 つのループを使用しています。

$missing = @()
foreach ($itemA in $shopA) {
  $found = 0
  foreach ($itemB in $shopB) {
    if ($itemB.item -eq $itemA.item) {
      $found = 1
    }
  }
  if ($found = 0) {
    $missing += $itemA
  }
}

この方法は私にとってはうまくいきますが、私の2つの配列は非常に大きく、配列全体をループするよりも速い方法が必要です...

私はこれを行うためのより良い方法を見つけてきました.compare-objectはほとんど仕事をしますが、すべての例は一次元配列でのみ機能するようです.

ありがとう

4

2 に答える 2

1

あなたが反対を主張しているにもかかわらず、私が見ることができるものから、あなたは2つの1D配列を持っています。

不足しているアイテムを見つける単純な方法は、

$missing = $shopA | ? { $x = $_; !($shopB | ? {$_.item -eq $x.item})}

ただし、これは常に O(n²) になります。より速くするために、最初に hastable からすべてのアイテムを収集できます$shopB。これにより、O(n) ではなく O(1) の存在がチェックされます。

$hash = @{}
$shopB | %{ $hash[$_.item] = 1 }
$missing = $shopA | ?{ !$hash.ContainsKey($_.item) }
于 2012-05-23T09:15:54.237 に答える
0

このようなもの?

 $shopA= @(1, 2, 3, 4)
 $shopB= @(4, 3, 5, 6)
 $shopB | where { $shopA -notcontains $_  }
于 2012-05-23T09:02:02.227 に答える