Perl Brasil

Pesquisar

Documentação

Artigos

Planeta

Eventos

Comunidade

r2 - 06 Aug 2006 - JoenioCosta

Como descobrir a diferença ou a intersecção entre dois arrays

Problema

Você precisa descobrir quais elementos de uma lista estão presentes em uma outra lista; ou quais elementos estão presentes em apenas uma das listas.

Solução

Use um hash.

Discussão

Sempre que você estiver lidando com conjuntos (o que é frequentemente indicado por expressões tais como "presente em", "ausente em", "intersecção", etc), você deve pensar automaticamente em um hash.

Com hashes você pode fazer estes testes facilmente:

# verificar este código
my %union = (%a,%b);
foreach (keys %union) {
    if (defined $a{$_} and defined $b{$_}) {
        $interseccao{$_} = 1;
    } else {
        $diferenca{$_} = 1;
    }
}

Para obter um hash a partir dos elementos de um array:

    my %a = map(($_ => 1), @a);
    my %b = map(($_ => 1), @b);

Comentários