Если действие каждой комбинации статично, вы можете построить двумерный массив:
var data = [
[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25]
];
Числа в приведенном выше примере могут быть любыми, такими как строка, массив и т. д. Извлечение значение теперь однострочное (если ползунки имеют диапазон значений [0,5]:
var info = data[firstSliderValue][secondSliderValue];
Другой способ сделать это - использовать Array :: Utils
use Array::Utils qw(:all);
my @a = qw( a b c d );
my @b = qw( c d e f );
# symmetric difference
my @diff = array_diff(@a, @b);
# intersection
my @isect = intersect(@a, @b);
# unique union
my @unique = unique(@a, @b);
# check if arrays contain same members
if ( !array_diff(@a, @b) ) {
# do something
}
# get items from array @a that are not in array @b
my @minus = array_minus( @a, @b );
Вам нужно предоставить гораздо больше контекста. Есть более эффективные способы сделать это, начиная от:
Выйти за пределы Perl и использовать shell (sort
+ comm
)
map
один массив в Perl хэш, а затем перебрать другой, проверяя принадлежность хэша. Это имеет линейную сложность ("M+N" - в основном цикл по каждому массиву один раз) в отличие от вложенного цикла, который имеет сложность "M*N")
Пример:
my %second = map {$_=>1} @second;
my @only_in_first = grep { !$second{$_} } @first;
# используйте цикл foreach с `last` вместо "grep"
# если вам нужен только ответ "да/нет" вместо полного списка
Используйте модуль Perl, который делает последний пункт за вас (List::Compare был упомянут в комментариях)
Делайте это на основе временных меток, когда элементы были добавлены, если объем очень большой и вам нужно часто пересчитывать. Несколько тысяч элементов - это не очень большой объем, но недавно мне пришлось сравнивать списки размером в 100 тысяч.
perlfaq4
на помощь:
Как вычислить разность двух массивов? Как вычислить пересечение двух массивов?
Используйте хэш. Вот код, позволяющий сделать и то, и другое, и даже больше. Он предполагает, что каждый элемент уникален в данном массиве:
@union = @intersection = @difference = (); %count = (); foreach $element (@array1, @array2) { $count{$element}++ } foreach $element (keys %count) { push @union, $element; push @{ $count{$element} > 1 ? \@пересечение : \@difference }, $element; }
Если вы правильно объявите свои переменные, код будет выглядеть следующим образом:
my %count;
for my $element (@array1, @array2) { $count{$element}++ }
my ( @union, @intersection, @difference );
for my $element (keys %count) {
push @union, $element;
push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
}