Самый эффективный способ найти дубликаты в не сгруппированных разделах большого хэша - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь найти наиболее эффективный способ отсеивания любых дубликатов в большой хэш-таблице, состоящей из почти 5 тыс. Объектов.

Я выполняю все это в Powershell.Итак, у меня есть эта большая хеш-таблица, которая состоит (по сути) из имен пользователей и подписок

1. User_id  |  Sub_name
2. User_id  |  Sub_name

etc...

В большинстве случаев для каждой User_id существует 5+ строк, поскольку каждая новая строка представляет имя подпискина которого подписан пользователь.

Что мне нужно сделать, это: Определить дубликаты подписок для каждого пользователя.Например,

1. mm1234 | sub_1
2. mm1234 | sub_4
3. mm1234 | sub_1
4. mm9999 | sub_1
5. mm9999 | sub_2
6. mm8888 | sub_1
7. mm8888 | sub_1

Итак, в приведенном выше примере мне нужно удалить строки 3 & 7.Теперь, в настоящее время нет фактической группировки с точки зрения того, как пользователи группируются в хэше, они просто добавляются. Мне интересно, возможно ли сделать это из окончательного хэша продукта, как показано выше.Мысли?

1 Ответ

0 голосов
/ 10 апреля 2019

Может быть, это может помочь.

Если ваш большой хеш выглядит примерно так:

$hash = @{
    '1' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_1' }
    '2' = @{ 'user_uuid' = 'mm5678'; 'lob' = 'subscription_1' }
    '3' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_2' }
    '4' = @{ 'user_uuid' = 'mm5678'; 'lob' = 'subscription_5' }
    '5' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_3' }
    '6' = @{ 'user_uuid' = 'mm1478'; 'lob' = 'subscription_1' }
}

Вы можете создать новый хеш результата, где ключами являются user_uuid, а значения - это массивы уникально отсортированных подписок (или lob, как вы их называете)

$result = @{}
$hash.Keys | ForEach-Object {
    $uid   = $hash.$_.user_uuid
    $value = $hash.$_.lob
    if ($result.ContainsKey($uid)) {
        # add to the subscriptions array for this user_uuid
        $result[$uid] = ($result[$uid] + $value) | Sort-Object -Unique 
    }
    else {
        # create an element for this user_uuid and make sure the value is an array
        $result[$uid] = @($value)
    }
}

Полученный Hashtable будет иметь следующее содержимое:

Name          Value                                                                                                                                                                  
----          -----                                                                                                                                                                  
mm1234        {subscription_1, subscription_2, subscription_3}                                                       
mm1478        {subscription_1}                                                                                                                                                       
mm5678        {subscription_1, subscription_5}

Если вам нужно преобразовать это обратно в формат оригинала $hash (хэш хэшей), вы можете сделать что-то вроде этого:

# recreate the large hash using the deduped values
$newHash = @{}
$count = 1
$result.Keys | ForEach-Object {
    foreach ($value in $result.$_) {
        $newHash[$count++] = @{ 'user_uuid' = $_; 'lob' = $value }
    }
}
...