Сравнивая два массива и получи значения, которые не являются общими
Я хотел небольшую логику, чтобы сравнить содержимое двух массивов и получить значение, которое не является распространенным среди них, используя powershell
пример если
$a1=@(1,2,3,4,5)
$b1=@(1,2,3,4,5,6)
$c, который является выводом, должен дать мне значение "6
"который является выводом необычного значения между двумя массивами.
Может кто-нибудь помочь мне с тем же! Спасибо!
7 ответов
PS > $c = Compare-Object -ReferenceObject (1..5) -DifferenceObject (1..6) -PassThru
PS > $c
6
$a = 1,2,3,4,5
$b = 4,5,6,7,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
Смотреть на 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
Ваши результаты не будут полезны, если массивы не будут сначала отсортированы. Чтобы отсортировать массив, запустите его через 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)
Пытаться:
$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
}
Вот немного другая идея, которая используетCompare-Object
но выдает результат, аналогичный ответу @iRon , где вывод содержит то, что находится в $a, но не в $b, и наоборот:
PS > Compare-Object -ReferenceObject (0..5) -DifferenceObject (1..6) -PassThru | ? {$_.SideIndicator -eq '=>'}
6
PS > Compare-Object -ReferenceObject (0..5) -DifferenceObject (1..6) -PassThru | ? {$_.SideIndicator -eq '<='}
0
PS: вдохновлен комментарием @mklement0.