首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多维数组中的唯一数组

多维数组中的唯一数组
EN

Stack Overflow用户
提问于 2022-07-22 12:14:24
回答 1查看 84关注 0票数 1

我有一个多维数组,我正在寻找一种方法来获取数组中唯一的元素。

代码语言:javascript
代码运行次数:0
运行
复制
use strict;
use feature 'say';
use List::Util 'shuffle';
#use List::MoreUtils 'uniq';

my @array = shuffle (
    [4, 10],
    [5, 6],
    [1, 2],
    [1, 2],
    [1, 2]
);

sub uniq {
    my %seen;
    grep !$seen{$_}++, @_;
};
my @unique = uniq(@array); 
foreach (@unique) {say "@$_";};

但这不管用。似乎多维数组中的每个数组都是不同的引用。

我尝试使用来自MoreUtils的uniq,但它也不起作用。

请帮帮忙。

P/s:我在寻找一种生产4,101,2的方法。

EN

回答 1

Stack Overflow用户

发布于 2022-07-22 12:44:16

您必须在%seen哈希中引用两个数组值:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use List::Util 'shuffle';


my @array = shuffle (
    [4, 10],
    [5, 6],
    [1, 2],
    [1, 2],
    [1, 2]
);

sub uniq {
    my %seen;
    grep !$seen{$_->[0]}{$_->[1]}++, @_;
};
my @unique = uniq(@array); 
foreach (@unique) {say "@$_";};

与嵌套的散列不同,您可以对这两个元素进行如下所示的字符串化:

代码语言:javascript
代码运行次数:0
运行
复制
grep !$seen{"$_->[0],$_->[1]"}++, @_;

对于任意数据结构数组的一般情况,可以序列化元素。此示例使用Storable::freeze进行序列化。需要将$Storable::canonical设置为true,以便对数据结构进行比较。见文档。正如@Ikegami所指出的,这仍然会导致浮点数的问题.

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use List::Util 'shuffle';
use Data::Dumper;
use Storable qw/freeze/;
#use List::MoreUtils 'uniq';

my @array = shuffle (
    [4, 10],
    [5, 6],
    [1, 2],
    [1, 2],
    [1, 2],
    [1,2,3],
    [1,2,{foo=>'bar'}],
    [1,2,{foo=>'bar'}],
    [1,2,{foo=>'baz'}],
);

sub uniq {
    my %seen;
    local $Storable::canonical = 1;
    grep !$seen{freeze( $_ )}++, @_;
};
my @unique = uniq(@array); 
say Dumper \@unique;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73080186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档