【问题标题】:Sorting an array in perl在perl中对数组进行排序
【发布时间】:2013-01-18 21:59:24
【问题描述】:

我在 perl 中有一个数组,其中包含大约 200 个用于 csv 文件的索引。它喜欢下面的几行:

46.9234784633993,Springwood Drive,Naples,FL
89.7786182217159,W 8th St,Lakeland,FL

我想按第一个逗号之前的数字对它们进行排序。我尝试只使用排序,但有时数字会达到成百上千,它只是对所有 1 中的数字进行排序。然后数字排序不喜欢它,因为它们不是数字条目

我试过了

my @sortedDistances = sort{ $a <=> $b }(@completedDistances);
and
my @sortedDistances = sort(@completedDistances);

【问题讨论】:

  • 那么数字排序不喜欢它,因为它们不是数字条目????
  • 向我们展示您的尝试。我们无法从您的描述中看出您做错了什么。编辑您的问题以包含失败的代码。然后,描述究竟是什么不起作用。当你尝试它时发生了什么?你得到不正确的结果吗?您得到 no 结果了吗?如果结果不正确,是什么导致它们不正确?你期待什么?你得到任何正确的结果了吗?如果是这样,它们是什么?不要让我们猜测。

标签: perl sorting


【解决方案1】:

这是一个可能的解决方案,如果可行,请尝试:

open FILE, "<", $ARGV[0] or die $!;
my @sorted =
    map { join ",", @{$_} }
    sort { $a->[0] <=> $b->[0] }
    map { [ split /,/ ] } <FILE>;
close FILE;
say join "\n", @sorted;

编辑:将冒号改为逗号

【讨论】:

  • 这其实是正确的答案。可能值得注意的是,使用类似split /,/, $_, 2(带有第三个参数)的东西更有效,因为它限制了执行的正则表达式匹配的数量。 (另外,咀嚼然后加入换行符很有趣;print @sorted 应该也可以)
【解决方案2】:

经典的Schwartzian Transform,我认为@sdir 打算编码,看起来像这样

use strict;
use warnings;

my @sorted =  map $_->[0],
              sort { $a->[1] <=> $b->[1] }
              map [$_, /([^,]+)/], <>;

print for @sorted;

【讨论】:

  • 如果最后一个未排序的 csv 行不以 \n 结尾并且该行不是排序后的最后一行,则两行将一起打印,例如,“46.9234784633993,Springwood Drive,Naples,FL89 .7786182217159,W 8th St,Lakeland,FL"。也许map {chomp; [$_, /([^,]+)/]} &lt;&gt;; 然后print join "\n", @sorted; 会有所帮助。
【解决方案3】:

正常排序来救援

sort -t, -n -k1,1 file.cvs

-t,表示在comman处分开

-n 或 -g 数字排序

-k1,2 使用第 1 到 2 列见 -t

man sort

【讨论】:

  • @sdir: 不,但是纯粹的家伙提到了他自己“排序”,并且使用正确它可以节省你很多时间编写有趣的 perl oneliners,并调试它们。
  • 确实如此。我肯定也会用 shell 排序来做到这一点。但是 perl 更有趣(而且我实际上经常使用那个 'oneliner')。顺便说一句,没有冒犯。
  • 很抱歉它会起作用,但我现在需要保留它 perl。我不知道这需要自动完成 35000 次
【解决方案4】:

我会编写一个排序函数来获取每个项目的第一项,然后对这些项目进行比较。它的形式是:

sub sortStuff($$)
{
  my ($a) = split(',',$_[0]);
  my ($b) = split(',',$_[1]);

  return ( $a <=> $b ) ;
}

然后调用子例程作为调用排序的一部分:

@sortedArray = sort sortStuff @array;

它将按数字排序并忽略该行中的其余项目。

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 2011-03-17
    • 2011-07-06
    • 2012-01-21
    • 1970-01-01
    • 2016-08-07
    • 2021-11-08
    • 2018-12-05
    相关资源
    最近更新 更多