Domanda

Rendiamolo molto semplice. Quello che voglio:

@array = qw/one two one/;
my @duplicates = duplicate(@array);
print "@duplicates"; # This should now print 'one'.

Come stampare valori duplicati di un array / hash?

È stato utile?

Soluzione

sub duplicate {
    my @args = @_;
    my %items;
    for my $element(@args) {
        $items{$element}++;
    }
    return grep {$items{<*>} > 1} keys %items;
}

Altri suggerimenti

# assumes inputs can be hash keys
@a = (1, 2, 3, 3, 4, 4, 5);

# keep count for each unique input
%h = ();
map { $h{<*>}++  } @a;

# duplicate inputs have count > 1
@dupes = grep { $h{<*>} > 1 } keys %h;

# should print 3, 4
print join(", ", sort @dupes), "\n";

La versione extra dettagliata e leggibile di ciò che vuoi fare:


sub duplicate {
   my %value_hash;
   foreach my $val (@_) {
     $value_hash{$val} +=1;
   }
   my @arr;
   while (my ($val, $num) = each(%value_hash)) {
     if ($num > 1) {
        push(@arr, $val)
     }
   }
  return @arr;
}

Questo può essere abbreviato considerevolmente, ma l'ho lasciato intenzionalmente dettagliato in modo che tu possa seguirlo.

Tuttavia, non l'ho provato, quindi fai attenzione ai miei errori di battitura.

Utilizza un dizionario, inserisci il valore nella chiave e il conteggio nel valore.

Ah, ho appena notato che hai taggato come perl

while ([...]) {
 $hash{[dbvalue]}++
}

Non specificato nella domanda è l'ordine in cui i duplicati devono essere restituiti.

Posso pensare a diverse possibilità: non importa; per ordine di prima / seconda / ultima occorrenza nell'elenco di input; ordinato.

Vado a giocare a golf!

sub duplicate {
    my %count;
    grep $count{

Vado a giocare a golf!

<*>}++, @_; } @array = qw/one two one/; my @duplicates = duplicate(@array); print "@duplicates"; # This should now print 'one'. # or if returning *exactly* 1 occurrence of each duplicated item is important sub duplicate { my %count; grep ++$count{

Vado a giocare a golf!

<*>} == 2, @_; }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top