获取数组中重复值的索引

时间:2019-10-16 07:24:30

标签: arrays powershell

我想在数组中找到重复值的索引。

例如

输入:

$data = @(1, 2, 3, 2, 1)

输出:

$indexes = @(3, 4)

3 个答案:

答案 0 :(得分:1)

对于另一种方法,可以将try-catch块与哈希表一起使用。

$data = @(1, 2, 3, 2, 1)
$hash = @{}
$indexes = for ($i = 0; $i -lt $data.count; $i++ ) {
    try {
        $hash.add($data[$i],$i)
    } 
    catch {
        $i
        continue
    }
}

# Output

$indexes
3
4

这里的想法是将每个值作为键,并将相应的索引作为值添加到哈希表。由于[hashtable]对象只能具有唯一键,因此将引发并捕获异常。在catch块中,我们只输出最终存储在$indexes中的索引。 continue语句允许循环递增并保持处理。


从算法上讲,该解决方案与已经提出的解决方案几乎相同。但是,它使用Add()的更有效的[arraylist]方法,而不是在每次迭代期间重建(+=[array]。在此示例中,性能可以忽略不计,但在较大的数据集中可能值得考虑。这也选择了传统的for循环,而不是foreach

$uniqueValues = [collections.arraylist]@()

$indexes = for ($i = 0; $i -lt $data.count; $i++) {
    if ($uniqueValues -contains $data[$i]) {
        $i
    } 
    else {
        [void]$uniqueValues.Add($data[$i])
    }
}

# Output
$indexes
3
4

此解决方案维护[arraylist]个唯一值($uniqueValues)。任何非唯一值,其索引($i)都会输出并存储在$indexes中。唯一性是通过使用-contains运算符将$data迭代中的当前值与$uniqueValues中已经存在的值进行比较来确定的。

答案 1 :(得分:1)

您还可以为此使用哈希表:

3
4

结果:

users = [{
  name: "user1",
  role: ["admin", "tester", "viewer"],
  },{
  name: "user2",
  role: ["admin", "tester", "viewer"],
  }
]


userRole = users.map(user => {
  roles = user.role.map(x => {
    return {role:x,user:user.name}
  })

   return { 
      name: user.name,
      role: roles
   }
})
console.log(userRole)

答案 2 :(得分:0)

内部有if的Foreach循环应该可以完成这项工作:

$data = @(1, 2, 3, 2, 1)
$uniqueValues = @()
$duplicatesIndexes = @()
$data | ForEach-Object {$counter = 0}{
  if ($_ -notin $uniqueValues) {
    $uniqueValues += $_
  } else {
    $duplicatesIndexes += $counter
  }
  $counter++
}

# Output
PS> $duplicatesIndexes
3
4