作者WalkingIce (会走路的冰块)
看板perl
标题Re: [问题] 关於排序
时间Thu Jul 19 16:56:35 2007
※ 引述《handsomegirl (薰)》之铭言:
: ※ 引述《abliou (Art of Life)》之铭言:
: : 栏位资料取出做成hash的key
: : 再对key做排序
: 不过的栏位资料不单是在第一列才有
: 它是把一部份的资料显示完後
: 再继续下个部分的栏位
: 举例好了,我说的好像有点难懂
: 抱歉 刚才举错例子
: 应该是这样才对
: A NO1 2006/10/10 18:36
: B NO2 2007/12/12 16:37
: . . . .
: . . . .
: G NO2 2007/12/13 17:20
: 这是一个档案的内容
: 基本上应希望以NO排序,因为可以区分是哪一个NO的状态
: 档案原本是CSV我把它全部读取出来变成这样子
: 怎麽做hash~就不大理解了..
如果拿 NO 来做 hash 的 key
那 row B 跟 row G 只会剩下一个吧?!
我也遇过类似的问题,那时候第一个想法就是想要像 java 一样
全部弄成 object,然後针对 object 的某个值来做比较 [注]
只是我不会用 Perl 这样写,而且我也不会 Perl 的OO (泣)
[注]
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html
然後,我又继续用土炮的方式 (对不起,我是乡民)
当每一行我要排序的资料都放入阵列之後,我把那些资料的顺序调动
把我想要拿来比较的栏位放到最前面,接着 sort 一次
my @unsort;
foreach $line(@array) {
# 很丑的正规表示式, 自己再改一下吧 #
# 我想拿第二个栏位来比较,所以把 $2 放到最前面 #
my $new = "$2--$1--$3--$4\n" if $line =~m{(.)\s+(.+)\s\s\s(.+)\s(.+)};
push(@unsort,$new);
}
@sort = sort @unsort;
print @sort;
排序前
A NO1 2006/10/10 18:36
B NO2 2007/12/12 16:37
C NO3 2007/12/13 17:40
D NO1 2005/01/01 00:01
G NO2 2007/12/13 17:20
程式执行结果
NO1--A--2006/10/10--18:36
NO1--D--2005/01/01--00:01
NO2--B--2007/12/12--16:37
NO2--G--2007/12/13--17:20
NO3--C--2007/12/13--17:40
啊?什麽?资料输出的长相不一样?
那...那就同样的技俩再玩一次啊!
--
我承认,这样的土炮方法很没有水准.....Orz
--
我想你会衰成这样都是我害的
---- Tizzy Mac
紧张的麦金塔?这是谁(._.?)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.128.98.6
1F:推 LiloHuang:请上网找 Schwartzian转换 与 GRT转换 的使用方式:) 07/19 18:09