免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3132 | 回复: 10
打印 上一主题 下一主题

向大牛请教这个算法.... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-23 10:54 |只看该作者 |倒序浏览
文本如下:
1300018   a1
1300019   a1
1300100   a2
1300101   a2
1300126   a2
1300127   a2
1300128   a2
1300129   a2
1300130   a3
1300131   a3
1300132   a3
1300133   a3

如何可以得到如下输出

a1 2file
1300018
1300019

a2 6file
1300100   
1300101   
1300126   
1300127   
1300128   
1300129   

a3 4file
1300130
1300131  
1300132
1300133

有没有算法.....
想到一种..但是估计我这烂水平 很难实现..
吧2列都加入到hash 然后
用数字做key
如果
$hash[1300018] =  $hash[1300019]
那么 吧$hash[1300018] 的value 提出来 就是a1 变量....
但是后面碰到a2 怎么在处理...

论坛徽章:
0
2 [报告]
发表于 2009-07-23 11:23 |只看该作者
还是用hash,建议用a1, a2, a3做为key,value为array,记录每个key对应的数字

论坛徽章:
0
3 [报告]
发表于 2009-07-23 11:28 |只看该作者
用a1 a2 a3做key 怎么让他唯一呢

论坛徽章:
0
4 [报告]
发表于 2009-07-23 12:00 |只看该作者
a1, a2, a3分别作的key,不是3个一起做key,不唯一吗?

论坛徽章:
0
5 [报告]
发表于 2009-07-23 12:25 |只看该作者
顿悟......

my $prev;
while (<$fh>) {
    my ($field1, $field2) = split;

    if (!defined($prev) || $prev ne $field2) {
        print("\n") if !defined($prev);
        $prev = $field2;
        print("$field2\n");
    }

    print("$field1\n");
}

论坛徽章:
0
6 [报告]
发表于 2009-07-30 11:38 |只看该作者
#!/usr/bin/perl -w
my ($list,$key);
my $hash={};
open (FD,"txt") or die "cant open";
while(<FD>)
{
($list,$key)=split(/\s+/,$_);
push(@{$hash->{$key}},$list);
}
foreach (sort keys %{$hash}){
print "$_",scalar(@{$hash->{$_}})," files\n";
print "@{$hash->{$_}}\n";
}

论坛徽章:
0
7 [报告]
发表于 2009-07-30 19:23 |只看该作者
原帖由 cxfcxf 于 2009-7-23 12:25 发表
顿悟......

my $prev;
while () {
    my ($field1, $field2) = split;

    if (!defined($prev) || $prev ne $field2) {
        print("\n") if !defined($prev);
        $prev = $field2;
      ...



这样的话就是说默认a1 a2 a3已经排序过了哦?

论坛徽章:
0
8 [报告]
发表于 2009-07-31 14:45 |只看该作者

  1. #!/usr/bin/perl -w
  2. use strict;

  3. my %format;
  4. open FH, "test.txt";

  5. while( <FH> ) {
  6.     my($field_1, $field_2) = split;
  7.     push @{ $format{$field_2} }, $field_1;
  8. }

  9. while ((my $key, my $value_ref) = each %format) {
  10.     my $counts = @$value_ref = sort @$value_ref;
  11.     print "$key  $counts files\n";
  12.     foreach my $row (@$value_ref) {
  13.         print "$row\n";
  14.     }
  15.     print "\n";
  16. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2009-07-31 16:07 |只看该作者
Perl M群的?

[ 本帖最后由 lokchungk 于 2009-7-31 16:29 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-07-31 17:18 |只看该作者
原帖由 arccos2002 于 2009-7-30 11:38 发表
#!/usr/bin/perl -w
my ($list,$key);
my $hash={};
open (FD,"txt" or die "cant open";
while()
{
($list,$key)=split(/\s+/,$_);
push(@{$hash->{$key}},$list);
}
foreach (sort keys %{$hash}){ ...


arccos2002 has very clearly explained howto
....
    ($list,$key)=split(/\s+/,$_);    # split 2 fields
   
    push(@{$hash->{$key}},$list);     # create HOA (hash of Array) data structure:
    # such as:
    # { a1 => [1300018, 1300019  ],
    #     ...
    # }
......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP