首页 > 解决方案 > 如何比较数组中的相对位置?

问题描述

我正在使用Graph 包创建一个具有四个顶点的图形,如下所示:

my $graph = Graph->new;
$graph->add_edges(qw(a b c d));

我想循环遍历两个顶点的所有可能组合,我正在使用嵌套循环。

for my $i ($graph->vertices()){
  for my $j ($graph->vertices()) {
    (statement[s])
  }
}

但是,这会导致许多重复,例如 (a, b) 和 (b, a)。为了解决这个问题,我想要一个语句,使得第二个 for 循环仅在 $i 在列表中早于 $j 时运行。这些不是数字,所以这样的声明 if($i < $j)不起作用。但是程序以相同的顺序在列表中移动。我如何参考这个订单,或者设置一个订单并参考它?

编辑:如果有一种方法可以比较 for 循环中数组的索引,这可能会起作用。不过,我不确定这是否可能。

这是使用下面答案中给出的代码的完整嵌套 for 循环。

use strict;
use warnings;
use Graph;

my $graph = Graph->new;
$graph->add_edges(qw(a b c d));
my @vertices = $graph->vertices();

for my $i (0..$#vertices) {
    my $vi = $vertices[$i];
    for my $j ($i+1..$#vertices) {
        my $vj = $vertices[$j];
        my $graph = Graph->new;
        $graph->add_edges(qw(a b c d));
        my @vertices = $graph->vertices();
        $graph->add_edge("$i", "v");
        $graph->add_edge("$j", "v");
        $graph->delete_edge("$i", "$j");
        print $graph, "\n";
     }
}

标签: perl

解决方案


只需将所有顶点读入一个数组,然后设置嵌套循环。

my @vertices = $graph->vertices();

for my $i (0..$#vertices) {
    my $vi = $vertices[$i]; 
    for my $j ($i+1..$#vertices) {
        my $vj = $vertices[$j];
        ...
     }
}

更新:用户说他得到了下面的输出

 0-v,1-v,a-b,c-d;
 0-v,2-v,a-b,c-d;
 0-v,3-v,a-b,c-d;
 1-v,2-v,a-b,c-d;
 1-v,3-v,a-b,c-d;
 2-v,3-v,a-b,c-d

推荐阅读