设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5615|回复: 14
打印 上一主题 下一主题

[已经解决] 请教如何获取数组中某个值的元素个数

[复制链接]

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
跳转到指定楼层
1
发表于 2010-12-8 10:07:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 赛露休斯 于 2010-12-8 10:10 编辑

比如 a = [1,2,3,2,4,2,6,7,2]
如何获取a里面值为2的元素的个数?
我用循环依次对比感觉有些麻烦,而且要处理大数据
最近在研究XAS

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
15
发表于 2010-12-10 12:45:44 | 只看该作者
回复 goahead 的帖子

我错了……
  1. rb_block_call(obj, id_each, 0, 0, iter, (VALUE)memo);
复制代码
inject 里有这么一行,id_each == "each"
看来写这个函数的人是想统一接口重用代码,但这样一来就损失效率了,inject 成了 each 的外壳,自然不可能比 each 快。

inject 的设计初衷是为了贯彻 Ruby 自由的哲学,在传统的迭代上再抽象一层,就有了习惯于函数式编程的人熟知的函数。

点评

inject来源于Enumerate模块,该模块的方法要求类必须先实现each方法。【摘自各种Ruby书籍】  发表于 2010-12-11 13:49
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
14
发表于 2010-12-10 11:56:08 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
13
发表于 2010-12-10 11:49:22 | 只看该作者
回复 goahead 的帖子

inject 没有调用 each。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
12
发表于 2010-12-10 11:29:33 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
11
发表于 2010-12-8 21:07:26 | 只看该作者
回复 goahead 的帖子

用循环的话在 Ruby 1.8 效率确实更高,但这是一个程序设计泛型的问题。Lisp 的 foldl 这种折合机制是函数式语言的经典函数,只要是函数式语言背景占主要成分的程序员多半都会去用这个 Array#inject,而不是用命令式语言的循环。这里我们又再次看到了 Ruby 多泛型给我们带来的自由。

Ruby 1.9 的 Array#each 是这样:

  1. VALUE
  2. rb_ary_each(VALUE ary)
  3. {
  4.     long i;

  5.     RETURN_ENUMERATOR(ary, 0, 0);
  6.     for (i=0; i<RARRAY_LEN(ary); i++) {
  7.         rb_yield(RARRAY_PTR(ary)[i]);
  8.     }
  9.     return ary;
  10. }
复制代码
它比 1.8 多了一行 RETURN_ENUMERATOR(ary, 0, 0);
这是一个返回枚举器的例程,经费还是颇高的,我做过测试,单单比较 1.9 和 1.8 的 Array#each,1.8 的快许多。所以 1.9 的 each 只怕也比复杂的 Array#inject 快不了多少。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
167
在线时间
434 小时
注册时间
2009-1-1
帖子
643
10
 楼主| 发表于 2010-12-8 21:01:00 | 只看该作者
哦,8L的方法可以用
突然发现用最简单的each循环效率也还真不差(1000多个元素)
最近在研究XAS
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
9
发表于 2010-12-8 15:15:28 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
8
发表于 2010-12-8 11:20:55 | 只看该作者
回复 六祈 的帖子

第一种浪费内存了 XD
第二种是个好东西,源自 Lisp 的 foldl,不过应该是这样:
inject(0) { |number, item| item == value ? number + 1 : number }
这里要保证有整数返回值,否则会返回 nil,下一次的累计值 number 就会变成 nil 了:lol

点评

原来如此:lol  发表于 2010-12-8 11:51

评分

参与人数 1星屑 +240 收起 理由
六祈 + 240 不错的讨论~

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

旅之愚者

梦石
0
星屑
275
在线时间
812 小时
注册时间
2007-7-28
帖子
2148

贵宾

7
发表于 2010-12-8 10:51:12 | 只看该作者
本帖最后由 六祈 于 2010-12-8 12:02 编辑

回复 goahead 的帖子

比如
Array#find_all{|item| item == value}.size
或者
Array#inject(0){|number, item| item == value ? number + 1 : number}【多谢紫苏大人提点】

以上纯属交流…

点评

是的,each是不可避免的  发表于 2010-12-8 11:17
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 02:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表