diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-29 12:27:48 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-29 12:27:48 +0900 |
| commit | 0bd99d79595a3baf3fd4824f839a8e1f9ee7468c (patch) | |
| tree | f5efcae8aad7f5c09e1466beab678be6d25cca09 | |
| parent | 2ca5bed90173482fae66994a68bbfeb0b2b8093b (diff) | |
| parent | 6e9a088efbe678c93310cb22eb6612434b9f7a09 (diff) | |
| download | mruby-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.rb | 15 |
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 |
