Xpoint
   [напомнить пароль]

Сортировка данных по двум параметрам

Метки: [без меток]
[удл]
2016-09-04 18:42:46 [обр] Александр[досье]

Всем доброго времени суток. Занимаюсь программой для подсчета времени. Встретился с задачей сортировки данных в программе, сортировка никак не запускается:
Имеется файл входных данных:

1000001 77.847
1000004 79.914
1234568 89.656
1000001 212.843
1234568 225.265
1000004 234.535

на выходе хотелось бы увидеть:

  1. 1000001 134.996
  2. 1234568 135.609
  3. 1000004 155.621

значения в списке сортируются по меньшему времени и по наименьшему количеству кругов. Сортировка никак не хочет запускаться.
[code]
#!perl
 
use strict;
use warnings;
 
open(my $in, "<:encoding(UTF-16)", "INPUT.TXT") || die("Error open INPUT.TXT\n");

# хеш фамилий спортсменов
#my %sportsmans = (
# '1000001' => 'Иванов',
# '1000004' => 'Петров',
# '1234568' => 'Зингельшухер');

my %sportsmans ; # объ¤вл¤ю хеш массив
open(my $Nam, "<:encoding(cp1252)", "NAMES.txt") || die("Error open NAMES.TXT\n"); #открываю файл с именами
while (my $line = <$Nam>) { #запускаю чтение по строкам файла
$line =~ /(\d+).(.+?) \s* $/x; #вытаскиваю с помощью рег.выраж. первое и второе слово из файла и пишу его в $id и $name
my $id = $1;
my $name = $2;
$sportsmans{$id} = $name; # организую запись в ассоциативный массив
}
close ($Nam);

        
# хеш результатов
my %rezults;
 
while(my $instr = <$in>) {
    if ($instr =~ /\@/) {
        my $str = $instr;
        chop $str; chop $str;
        $str =~ m/@\s+(\S.*\S\t?)$/;
        my $temp_str = $1;
        
for (0..1) {
            $str = <$in>;
            chop $str; chop $str;
            $str =~ m/\] (.*)$/;
            $temp_str .= $1;
            }
        
$temp_str =~ m/(\d+)\t(\d+\.\d+)/;
        unless (exists($rezults{$1})) {
            $rezults{$1} = []; # если ранее этот спортсмен не встречалс¤ - создаЄм ссылку на пустой массив при значении кеша спорстменов с ключЄм $1
            }
        push @{$rezults{$1}}, $2; # добавл¤ем результат в конец массива
        }
    }
 
open(my $out, ">", "OUTPUT1.TXT") || die("Error open OUTPUT1.TXT\n");
# ¬ыводим результаты
foreach my $nomer_fio (sort(keys(%sportsmans))){
    showResult(\%sportsmans, \%rezults, $nomer_fio);
    }
close($out);
close($in);
 
# функци¤ вывода результатов конкретного спортсмена
sub showResult {
    my ($names, $rez, $name) = @_;
    my $previousTime = 0; # врем¤ предыдущего круга
    my $ring = 1; # номер круга
    print $out "–езультаты спортсмена $names->{$name}\n\n";
    print $out " руг\tќбщее врем¤\t¬рем¤ круга\n";
            
#my $counter = 0;
    foreach my $currTime (@{$rez->{$name}}) {
   #my @list = @{$rez->{$name}};
   my $delta = sprintf "%.3f", $currTime - $previousTime;
   #print $out $list[-1] - $list[-2];
   print $out "$ring\t$currTime\t$delta\n\n";
        $ring++;
        $previousTime = $currTime;
   }
    print $out "\n\n\n";
    }
[/code]

спустя 8 дней [обр] Евгений Седов aka KPbIC(38/176)[досье]
Powered by POEM™ Engine Copyright © 2002-2005