如何查看一系列数字并查找数组中包含的数字?

时间:2012-07-03 18:31:31

标签: arrays perl iteration

我正在尝试创建一个简单的Perl脚本来获取一系列数字(0..255),遍历每个数字并找到不在另一个数组中的数字。

这一点,我可以找到我的游戏中尚未占用哪些Minecraft块ID。第一个数组是范围0..255,它是最大可能的块ID。下一个数组是已经使用的ID,它们已经列出了一个列表。

所以我想要一种检查每个可能的块id的循环。我会在到达计算机时发布我的内容。

4 个答案:

答案 0 :(得分:4)

最简单(也是最快)的方法是将另一个数组转换为哈希值,然后检查是否存在键:

my %hash = map { $_ => 0 } @array2;

print (exists $hash{$_} ? "$_ is there\n" : "$_ is not there\n") for(0..255);

答案 1 :(得分:1)

为什么不使用

$occupied_lookup[$_] = 1 for 4,5,6;

而不是

@occupied_indexes = (4,5,6);

更轻松,更快速地占领某些东西:

$occupied_lookup[$_] = 1;

更容易,更快地制作无人居住的东西:

$occupied_lookup[$_] = 0;

检查是否有东西更容易,更快:

if ($occupied_lookup[$_])

查找所有占用的索引仍然很容易:

my @occupied_indexes = grep $occupied_lookup[$_], 0..$#occupied_lookup;

(其他人建议使用散列,但数组更快。)

答案 2 :(得分:0)

两个数组之间的差异并不一定意味着您需要for循环或while等。这会打印@allblocks中不在@occupiedones中的项目。

#!usr/bin/perl
use warnings;
use strict;
my @allblocks=(0...255);
my @occupiedones=(1,2,80,255)

my %occupiedones=map{$_=>1} @occupiedones;

# the difference of two arrays

my @diff=grep(!defined $occupiedones{$_}, @allblocks);

# proof it works
print "This is in one array and not the other:\t$_\n" foreach (@diff);

答案 3 :(得分:0)

这就是你想要的。代码中的注释解释。

#!/usr/bin/perl

use warnings;
use strict;

# Print members of @b that are not in @a.
# That is, loosely speaking, print @b minus @a.

my @a = (10, 20, 30, 40, 50);
my @b = (22, 25, 30, 40, 42);

my %a = map {$_=>1} @a;
$a{$_} or print "$_ " for @b;
print "\n";

我们的想法是将@a转换为哈希%a,然后使用哈希来控制减法。在哈希中,只有关键是感兴趣的;相应的值都只是1,这对于这种应用来说是常规的(虚拟值是Perl在C ++中实现的方式称为 set )。