summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-29 12:27:48 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-29 12:27:48 +0900
commit0bd99d79595a3baf3fd4824f839a8e1f9ee7468c (patch)
treef5efcae8aad7f5c09e1466beab678be6d25cca09
parent2ca5bed90173482fae66994a68bbfeb0b2b8093b (diff)
parent6e9a088efbe678c93310cb22eb6612434b9f7a09 (diff)
downloadmruby-0bd99d79595a3baf3fd4824f839a8e1f9ee7468c.tar.gz
mruby-0bd99d79595a3baf3fd4824f839a8e1f9ee7468c.zip
Merge pull request #2146 from utkarshkukreti/speed-up-select-bang
Speed up Array#select! from O(n^2) to O(n).
-rw-r--r--mrbgems/mruby-array-ext/mrblib/array.rb15
1 files changed, 5 insertions, 10 deletions
diff --git a/mrbgems/mruby-array-ext/mrblib/array.rb b/mrbgems/mruby-array-ext/mrblib/array.rb
index bddcd8ab8..3a4b1460b 100644
--- a/mrbgems/mruby-array-ext/mrblib/array.rb
+++ b/mrbgems/mruby-array-ext/mrblib/array.rb
@@ -675,16 +675,11 @@ class Array
def select!(&block)
return to_enum :select! unless block_given?
- idx = 0
- len = self.size
- while idx < self.size do
- if block.call(self[idx])
- idx += 1
- else
- self.delete_at(idx)
- end
+ result = []
+ self.each do |x|
+ result << x if block.call(x)
end
- return nil if self.size == len
- self
+ return nil if self.size == result.size
+ self.replace(result)
end
end