perl 根据多列排序(列的顺序很重要)
perl sorting according to multiple columns (order of column matters)
我正在尝试学习按多列对 perl 中的二维数组进行排序,以便按指定列的顺序对值进行排序,即先根据第一列排序,然后根据第二列排序列等。所以 table:
3 2
5 2
1 4
排序为
1 4
3 2
5 2
如果排序在第一列、第二列或到
3 2
5 2
1 4
如果先按第二列再按第一列排序。
但事实证明我什至无法根据任何列对 table 进行排序。
my @a = ([3,1,2], [3,5,4]);
my @b = sort {
$a->[0] <=> $b->[0]
} @a;
print Dumper \@b
什么都不做。我在哪里犯了错误以及如何以正确的列顺序实现上述排序?
您的代码确实有效。
正在将两个 sort
、[3,1,2]
和 [3,5,4]
的结果传递给标量。然后根据引用数组 ($a->[0] <=> $b->[0]
) 的元素对这两个元素进行排序。为什么什么都不做?好吧,因为这些数组与其第一个元素具有相同的值 (3
)。
如果您引用的数组在第一列中有不同的值(比如 [6,1,2]
和 [3,5,4]
),您将首先返回值最低的那个([3,5,4]
然后 [6,1,2]
).
你正在排序,只是不是你认为的那样。 @a
包含两个对象,都是数组引用。您正在按每个引用数组中第一个元素的值对这两个引用进行排序。
使用您的示例数据考虑以下内容:
@array = ([3,2],[5,2],[1,4]);
@sorted_01 = sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @array;
@sorted_10 = sort { $a->[1] <=> $b->[1] || $a->[0] <=> $b->[0] } @array;
构造 a<=>b || c<=>d
比较 a
和 b
。如果结果不为零(即 a
和 b
不相等),则表达式计算结束。但是,如果它们相等,则评估继续并且 returns 比较 c
和 d
的结果。
我正在阅读 my @a = ([3,1,2], [3,5,4]);
,因为它有 2 行,每行 3 列。我会存储 table
3 3
1 5
2 4
as my @a = ([3, 3], [1, 5], [2, 4]);
相反,使用 Short-circuit evaluation:
使排序更简单
my @a = ([3, 3], [1, 5], [2, 4]);
my @b = sort {
# Short-circuit evaluation:
# if the values in the first column aren't equal, return the <=> result for
# that, otherwise return the <=> result for the second column
$a->[0] <=> $b->[0] || $a->[1] <=> $b->[1];
} @a;
# @b is now ([1, 5], [2, 4], [3, 3])
我正在尝试学习按多列对 perl 中的二维数组进行排序,以便按指定列的顺序对值进行排序,即先根据第一列排序,然后根据第二列排序列等。所以 table:
3 2
5 2
1 4
排序为
1 4
3 2
5 2
如果排序在第一列、第二列或到
3 2
5 2
1 4
如果先按第二列再按第一列排序。
但事实证明我什至无法根据任何列对 table 进行排序。
my @a = ([3,1,2], [3,5,4]);
my @b = sort {
$a->[0] <=> $b->[0]
} @a;
print Dumper \@b
什么都不做。我在哪里犯了错误以及如何以正确的列顺序实现上述排序?
您的代码确实有效。
正在将两个 sort
、[3,1,2]
和 [3,5,4]
的结果传递给标量。然后根据引用数组 ($a->[0] <=> $b->[0]
) 的元素对这两个元素进行排序。为什么什么都不做?好吧,因为这些数组与其第一个元素具有相同的值 (3
)。
如果您引用的数组在第一列中有不同的值(比如 [6,1,2]
和 [3,5,4]
),您将首先返回值最低的那个([3,5,4]
然后 [6,1,2]
).
你正在排序,只是不是你认为的那样。 @a
包含两个对象,都是数组引用。您正在按每个引用数组中第一个元素的值对这两个引用进行排序。
使用您的示例数据考虑以下内容:
@array = ([3,2],[5,2],[1,4]);
@sorted_01 = sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @array;
@sorted_10 = sort { $a->[1] <=> $b->[1] || $a->[0] <=> $b->[0] } @array;
构造 a<=>b || c<=>d
比较 a
和 b
。如果结果不为零(即 a
和 b
不相等),则表达式计算结束。但是,如果它们相等,则评估继续并且 returns 比较 c
和 d
的结果。
我正在阅读 my @a = ([3,1,2], [3,5,4]);
,因为它有 2 行,每行 3 列。我会存储 table
3 3
1 5
2 4
as my @a = ([3, 3], [1, 5], [2, 4]);
相反,使用 Short-circuit evaluation:
my @a = ([3, 3], [1, 5], [2, 4]);
my @b = sort {
# Short-circuit evaluation:
# if the values in the first column aren't equal, return the <=> result for
# that, otherwise return the <=> result for the second column
$a->[0] <=> $b->[0] || $a->[1] <=> $b->[1];
} @a;
# @b is now ([1, 5], [2, 4], [3, 3])