сортировка массива по первому числу, найденному в каждом элементе

#perl #sorting

#perl #сортировка

Вопрос:

Я ищу помощь в сортировке массива, в котором каждый элемент состоит из «числа, затем строки, затем числа». Я хотел бы отсортировать по первому номеру часть элементов массива по убыванию (чтобы сначала перечислить более высокие числа), а также перечислить текст и т.д.

я все еще новичок, поэтому альтернативы приведенному ниже также приветствуются

 use strict;
use warnings;

my @arr = map {int( rand(49)   1) } ( 1..100 ); # build an array of 100 random numbers between 1 and 49

my @count2;

foreach my $i (1..49) {

    my @count = join(',', @arr) =~ m/$i,/g; # maybe try to make a string only once then search trough it... ???
my $count1 = scalar(@count); # I want this $count1 to be the number of times each of the numbers($i) was found within the string/array.

    push(@count2, $count1 ." times for ". $i); # pushing a "number then text and a number / scalar, string, scalar" to an array.
}

#for (@count2) {print "$_n";}
# try to add up all numbers in the first coloum to make sure they == 100

 #sort @count2 and print the top 7
@count2 = sort {$b <=> $a} @count2; # try to stop printout of this, or sort on =~ m/^anumber/ ??? or just on the first one or two d

foreach my $i (0..6) {
 print $count2[$i] ."n"; # seems to be sorted right anyway
}
 

Комментарии:

1. Поздравляю с использованием use strict и use warnings как новичка!

2. Пожалуйста, уточните, что вы на самом деле хотите сделать. Вы пишете о сортировке, а в коде есть что-то о подсчете. Если вы в конечном итоге захотите посчитать числа, вам не нужна сортировка … Однако, пожалуйста, предоставьте примеры для строк, которые вы хотите вычислить.

3. Количество / сумма были просто комментарием для меня halo, я еще не смотрел на это… вероятно, я спрошу здесь, в SO, если я не смогу с этим разобраться… Спасибо

Ответ №1:

Во-первых, храните свои данные в массиве, а не в строке:

 # inside the first loop, replace your line with the push() with this one:
push(@count2, [$count1, $i]; 
 

Затем вы можете легко выполнить сортировку по первому элементу каждого подмассива:

 my @sorted = sort { $b->[0] <=> $a->[0] } @count2;
 

И когда вы его печатаете, создайте строку:

 printf "%d times for %dn", $sorted[$i][0], $sorted[$i][1];
 

Смотрите также: http://perldoc.perl.org/perlreftut.html, perlfaq4

Комментарии:

1. Спасибо, Мориц, кажется, распечатывается. Хотя была опечатка: npush(@count2, [$count1, $ i]); ???

Ответ №2:

Принимая ваши требования как есть. Вероятно, вам лучше не встраивать информацию о количестве в строку. Тем не менее, я приму это как учебное упражнение.

Обратите внимание, я обмениваю память на краткость и, вероятно, скорость, используя хэш для подсчета.

Однако сортировку можно оптимизировать с помощью преобразования Шварца.

РЕДАКТИРОВАТЬ: создайте массив результатов, используя только те числа, которые были нарисованы

 #!/usr/bin/perl

use strict; use warnings;

my @arr = map {int( rand(49)   1) } ( 1..100 );

my %counts;
  $counts{$_} for @arr;

my @result = map sprintf('%d times for %d', $counts{$_}, $_),
             sort {$counts{$a} <=> $counts{$b}} keys %counts;

print "$_n" for @resu<
 

Тем не менее, я бы, вероятно, сделал что-то вроде этого:

 #!/usr/bin/perl

use strict; use warnings;
use YAML;

my @arr;
$#arr = 99; #initialize @arr capacity to 100 elements 

my %counts;

for my $i (0 .. 99) {
    my $n = int(rand(49)   1); # pick a number
    $arr[ $i ] = $n;           # store it
      $counts{ $n };           # update count
}

# sort keys according to counts, keys of %counts has only the numbers drawn
# for each number drawn, create an anonymous array ref where the first element
# is the number drawn, and the second element is the number of times it was drawn
# and put it in the @result array

my @result = map  [$_, $counts{$_}],
             sort {$counts{$a} <=> $counts{$b} }
             keys %counts;

print Dump @resu<
 

Комментарии:

1. Спасибо, Синан Унур, на данный момент мне кажется, что это сложно, но я буду работать над этим. Я также получаю несколько повторяющихся чисел в его выводе…

2. Ах, я забыл создать вторичный массив. Сделаю это.