Для другого подхода вы можете использовать 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
.