web-dev-qa-db-ja.com

2つの配列を比較し、一般的ではない値を取得する

2つの配列の内容を比較し、powershellを使用してそれらの間で一般的ではない値を取得するための小さなロジックが必要でした

$a1=@(1,2,3,4,5)
$b1=@(1,2,3,4,5,6)

出力である$ cは、値「6」を提供する必要があります。これは、両方の配列間で一般的でない値の出力です。

誰かが私を助けてくれますか?ありがとう!

59
PowerShell
PS > $c = Compare-Object -ReferenceObject (1..5) -DifferenceObject (1..6) -PassThru
PS > $c
6
97
Shay Levy

enter image description here

$a = 1..5
$b = 4..8

$Yellow = $a | Where {$b -NotContains $_}

$Yellowには、$aにある項目を除く$bのすべての項目が含まれます。

PS C:\> $Yellow
1
2
3

$Blue = $b | Where {$a -NotContains $_}

$Blueには、$bにある項目を除く$aのすべての項目が含まれます。

PS C:\> $Blue
6
7
8

$Green = $a | Where {$b -Contains $_}

問題ではありませんが、とにかく; Greenには、$a$bの両方にあるアイテムが含まれます。

PS C:\> $Green
4
5
46
iRon

Compare-Objectを見てください

Compare-Object $a1 $b1 | ForEach-Object { $_.InputObject }

または、オブジェクトがどこに属しているかを知りたい場合は、SideIndicatorを見てください。

$a1=@(1,2,3,4,5,8)
$b1=@(1,2,3,4,5,6)
Compare-Object $a1 $b1
15
stej

配列が最初にソートされない限り、結果は役に立ちません。配列を並べ替えるには、Sort-Objectを実行します。

$x = @(5,1,4,2,3)
$y = @(2,4,6,1,3,5)

Compare-Object -ReferenceObject ($x | Sort-Object) -DifferenceObject ($y | Sort-Object)
4
doer

試してください:

$a1=@(1,2,3,4,5)
$b1=@(1,2,3,4,5,6)
(Compare-Object $a1 $b1).InputObject

または、次を使用できます。

(Compare-Object $b1 $a1).InputObject

順序は関係ありません。

これは役立つはずで、単純なハッシュテーブルを使用します。

$a1=@(1,2,3,4,5) $b1=@(1,2,3,4,5,6)


$hash= @{}

#storing elements of $a1 in hash
foreach ($i in $a1)
{$hash.Add($i, "present")}

#define blank array $c
$c = @()

#adding uncommon ones in second array to $c and removing common ones from hash
foreach($j in $b1)
{
if(!$hash.ContainsKey($j)){$c = $c+$j}
else {hash.Remove($j)}
}

#now hash is left with uncommon ones in first array, so add them to $c
foreach($k in $hash.keys)
{
$c = $c + $k
}
1