[Perl] 刪除數組中重復元素


寫一個小程序時候,需要去除一個數組中的重復元素,搜索了一下,找到的代碼主要是兩種,一種是使用grep函數,一種是轉換為hash表,代碼分別如下:

使用grep函數代碼片段:
代碼:


my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
my %count;
my @uniq_times = grep { ++$count{ $_ } < 2; } @array;



使用轉換hash代碼片段:
代碼:


my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
my %saw;
@saw{ @array } = ( );
my @uniq_array = sort keys %saw;



使用grep那種方法並不是很好懂,我嘗試解釋一下,未必說得清楚或者正確。其實就是把數組的每個元素作為一個hash表的key,++之后第一個元素出現的時候值就是1,如果第二次出現這個值就是2了。其實就是統計了數組每個元素的出現次數,少於2次的就放到新的數組當中。我寫了個比較好懂的代碼,和使用grep方法的代碼原理大致相同,但是又不完全一樣,代碼如下:
代碼:


my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
my %count_hash;
my @uniq_array;
foreach my $value ( @array )
{
  if( exists( $count_hash{ $value } ) )
  {
     next;
  }
  else
  {
    $count_hash{ $value } = 1;
    push( @uniq_array, $value );
  }
}

 

#!/usr/bin/perl

use strict;

my %hash;
my @array = (1..10,5,20,2,3,4,5,5);
#grep 保存符合條件的元素
@array = grep { ++$hash{$_} < 2 } @array;

print join(" ",@array);
print "n";

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM