كيف يمكنني تخزين قيمة مكررة من صفيف أو تجزئة في بيرل؟

StackOverflow https://stackoverflow.com/questions/255114

  •  05-07-2019
  •  | 
  •  

سؤال

ودعونا نجعل هذا سهلا جدا. ما أريد:

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

وكيفية طباعة القيم المكررة من مجموعة / التجزئة؟

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

# 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";

وومطول، نسخة قابلة للقراءة اضافية اضافية ما تريد القيام به:


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;
}

ويمكن اختصارها هذا إلى حد كبير، ولكنني تركت عمدا مطول بحيث يمكنك متابعة على طول.

وأنا لم اختباره، ورغم ذلك احترس من الأخطاء المطبعية بلدي.

استخدم القاموس، وضع القيمة في مفتاح، والفرز في القيمة.

وآه، لاحظت فقط كنت قد يوصف بانه بيرل

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

وغير محدد في السؤال هو الترتيب الذي ينبغي أن تعاد التكرارات.

وأستطيع أن أفكر في عدة احتمالات: لا أهتم. بأمر من الأول / الثاني / قوع الأخير في القائمة المدخلات؛ فرزها.

وانا ذاهب الغولف!

sub duplicate {
    my %count;
    grep $count{$_}++, @_;
}

@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{$_} == 2, @_;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top