2015-04-22 42 views
-2

我不知道確切的詞,但這是我想要在Perl中實現的。Perl - 嘗試使用排序方法

我有一個名爲$var

my $var = "10 60 20 70 30 60 30 50 50 40 40 30 40 20 50 10 60"; 

這是一個動態值的變量。目前我預定義它只是爲了便於理解。

然後我分裂$var

my $var1 (split //, $var); 

,並從這個角度,我不知道我在說什麼。

我想排序$var1這樣

30 40 50 10 20 30 40 50 60 10 20 30 40 50 60 70 

有沒有辦法實現這個結果呢?

我試着研究排序,但沒有發現我發現的結果覆蓋了這個問題。通常如果我用他們的方法,我會得到10 20 30 ...等等。

+8

排序要求背後的邏輯是什麼? – fugu

+0

我真的不知道如何描述這個,但如果有一個值像1 2 3 4 4 2 5 3 6我想排序這樣像4 5 6(<<不完整模式第一)1 2 3 4 5 6( << complete pattern)所以它會是這樣的3 4 5 1 2 3 4 5 6 – WESTKINz

回答

4

我可以對你的問題作出的最好的理解是,你想要一個列表層次結構 - 每個列表包含序列中下一個列表中的所有重複項。但輸入中有三個60,輸出中只有兩個。

該解決方案的工作原理是將每個值推送到@groups的第一個元素,該元素尚未包含該值。一旦所有的物品放置,陣列反轉,每個子陣列按數字排序

use strict; 
use warnings; 

use List::Util 'any'; 

my $var = "10 60 20 70 30 60 30 50 50 40 40 30 40 20 50 10 60"; 

my @var = split ' ', $var; 

my @groups; 

for my $item (@var) { 
    my $i = 0; 
    ++$i while any { $item == $_ } @{ $groups[$i] }; 
    push @{ $groups[$i] }, $item; 
} 

@groups = map [ sort { $a <=> $b } @$_ ], reverse @groups; 

use Data::Dump; 
dd \@groups; 

輸出

[ 
    [30, 40, 50, 60], 
    [10, 20, 30, 40, 50, 60], 
    [10, 20, 30, 40, 50, 60, 70], 
] 
+0

是否可以將輸出格式化爲「30 40 50 60 10 20 30 40 50 60 10 20 30 40 50 60 70」 – WESTKINz

+3

@ WESTKINZ:是的。是的。你是如何決定做這個沒有你自己的努力? – Borodin

+0

我正在閱讀關於Perl的書籍,並希望我像你這樣的切肉刀,但這是我第一個嘗試Perl的月份,我只是試驗我的想法:) – WESTKINz

0

也許你想要把相同的值在箱和排序箱。

1 1 
2 2 
3 3 
4 
5 
6 

然後你讀的答案落筆列,從最右邊的列到左邊的列。嘗試更多的例子,讓我們知道。