【问题标题】:Sort a Perl array of objects by dates按日期对 Perl 对象数组进行排序
【发布时间】:2014-05-11 21:44:58
【问题描述】:

我需要通过insertDate 订购@list 数组,但是由于它是$obj 数组,我该如何访问它?

我尝试了 Perl 的 sort 函数,但我不明白它如何处理这种由 $obj 组成的数组。

sub getLastQuestions {
  my ($page) = @_;
  $page ||= 1;

  my $questionPerPage = 30;
  my @list            = [];

  my @questions = $db->findNodes("/db/questions/question");

  if (@questions) {
    foreach my $question (@questions) {
      my $id         = $question->findvalue("\@id");
      my $title      = $question->findvalue("title");
      my $author     = $question->findvalue("author");
      my $insertDate = $question->findvalue("insertDate");

      my $obj = Model::Question->new(
        path       => "vedi-domanda.cgi?id=" . $id,
        title      => $title,
        author     => $author,
        insertDate => $insertDate
      );

      # Aggiungi uno
      push @list, $obj;
    }
  }

  return @list;
}

【问题讨论】:

标签: arrays perl sorting


【解决方案1】:

注意,不需要

if (@questions) { ... }

因为

foreach my $question (@questions) { ... }

如果数组为空则不会执行

在您的@list 初始化中还有一个错误,您将其设置为[]。这不会清空数组 - 它将它设置为具有一个包含对空数组的引用的元素。只是my @list 是正确的。

最简单的方法是在将@questions 数组转换为Model::Question 对象数组之前对其进行排序。

确切的代码完全取决于 XML 中日期字符串的格式,但如果它们格式正确,例如 ISO 8601 日期,则可以将它们排序为字符串以获得所需的效果。所以你可以写

  my @questions = sort {
    my ($aa, $bb) = map $_->findvalue('insertDate'), ($a, $b);
    $aa cmp $bb;
  } $db->findNodes('/db/questions/question');

请注意,您没有显示日期字符串的格式,因此如果没有一些额外的编码,这可能无法正常工作

您可能还想使用 map 将 XML 节点转换为 Model::Question 对象,正如我在这个子例程中展示的那样

sub get_last_questions {

  my ($page) = @_;
  $page ||= 1;

  my $_PerPage = 30;

  my @questions = sort {
    my ($aa, $bb) = map $_->findvalue('insertDate'), ($a, $b);
    $aa cmp $bb;
  } $db->findNodes('/db/questions/question');

  my @list = map {
    Model::Question->new(
      path       => 'vedi-domanda.cgi?id=' . $_->findvalue('@id'),
      title      => $_->findvalue('title'),
      author     => $_->findvalue('author'),
      insertDate => $_->findvalue('insertDate'),
    );
  } @questions;

  return @list;
}

【讨论】:

  • @user2458579:Stack Overflow 的核心概念是它应该演变成一个解决大多数编程问题的库。如果这篇文章对您有所帮助,那么如果您能写一条评论来说明您的经历,那就太好了。特别是,您从未描述过要用于对记录进行排序的日期字符串。如果您通过编写您的最终解决方案的描述来回报我的努力,其他可能会觉得这很有用的人会得到帮助。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2016-11-05
  • 2011-10-30
  • 2015-02-25
  • 2013-10-26
相关资源
最近更新 更多