please look at the comments in code and see if you can help me with this I am checking to see if a value from $arr1 is in $arr2. If it is, add it to a list, if it is not, add it to another list. Make sure both list/arrays do not have duplicates.
$arr1 = @(1,2,3,4,4,2,5,7,9,9,1)
$arr2= @(5,1,2,3,6,8,1)
$NotinList = @()
$inList = @()
$counter = 0
for ($i = 0; $i -lt $arr1.length; $i ){
for( $j = 0; $j -lt $arr2.length; $j ){
if($arr1[$i] -ne $arr2[$j]){ #check to see if value from $arr1 is in $arr2
for($k = 0; $k -lt $NotinList.length; $k ){ #Traverse through empty array
write-host $arr1[$i]
if($NotinList[$k] -ne $arr1[$i]){ # *^ if empty array does not alreadycontain item from big $arr1, add it.
$NotinList = $arr1[$i]
}
}
}
else{
$inList = $arr1[$i]
#how would I remove duplicates from number in list since there are repeating numbers in $arr1 that are not in $arr2.
}
}
$counter #keep track may use for something else??
}
CodePudding user response:
I would eliminate the duplicates first and then use the Where()
array operator to split the array into the variables.
$arr1 = 'a','b','b','c','d','e','e','f','g'
$arr2 = 'a','b','c','g'
# not in list = d, e, f
# in list = a, b, c, g
$inlist,$notinlist = ($arr1 | Get-Unique).Where({$_ -in $arr2},'split')
Now here is what each contains
$notinlist
d
e
f
$inlist
a
b
c
g
CodePudding user response:
If you insist on doing it manually, I recommend using hashtables. They are extremely fast and the keys have to be unique.
If you care about the order you can use [ordered]
hashtables
$arr1 = 1,2,3,4,4,2,5,7,9,9,1
$arr2= 5,1,2,3,6,8,1
$inlist = [ordered]@{}
$notinlist = [ordered]@{}
foreach($entry in $arr1){
if($entry -in $arr2){
if($entry -notin $inlist.keys){
$inlist.$entry = $entry
}
}
else{
if($entry -notin $notinlist.keys){
$notinlist.$entry = $entry
}
}
}
Now your unique lists are in either/both they keys or the values
$inlist.Keys
1
2
3
5
$notinlist.Values
4
7
9