From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: poffice@blade.nagaokaut.ac.jp Delivered-To: poffice@blade.nagaokaut.ac.jp Received: from kankan.nagaokaut.ac.jp (kankan.nagaokaut.ac.jp [133.44.2.24]) by blade.nagaokaut.ac.jp (Postfix) with ESMTP id DA65019E0025 for ; Tue, 15 Dec 2015 13:43:40 +0900 (JST) Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by kankan.nagaokaut.ac.jp (Postfix) with ESMTP id 97F37B5D873 for ; Tue, 15 Dec 2015 14:15:39 +0900 (JST) Received: from neon.ruby-lang.org (neon.ruby-lang.org [221.186.184.75]) by voscc.nagaokaut.ac.jp (Postfix) with ESMTP id 13F2F18CC7E6 for ; Tue, 15 Dec 2015 14:15:40 +0900 (JST) Received: from [221.186.184.76] (localhost [IPv6:::1]) by neon.ruby-lang.org (Postfix) with ESMTP id B136D120482; Tue, 15 Dec 2015 14:15:38 +0900 (JST) X-Original-To: ruby-core@ruby-lang.org Delivered-To: ruby-core@ruby-lang.org Received: from o10.shared.sendgrid.net (o10.shared.sendgrid.net [173.193.132.135]) by neon.ruby-lang.org (Postfix) with ESMTPS id 10BBB120452 for ; Tue, 15 Dec 2015 14:15:34 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.me; h=from:to:references:subject:mime-version:content-type:content-transfer-encoding:list-id; s=smtpapi; bh=fecvNZJquLXY/u5bnhA6RCpu280=; b=rC4GTSVlnsrhsZjHID vsfroq05NZk6EBLIQ6SQixNHy07arTFxtPLCsaBAzFe3KNnx0SFBQabtChXPYEEK LY0h9tft67M1ZFXZQeZOd3Ym5QJccPadYoActkNTFv24VOrH2yjpy79BFirl8+3I JcYtFBICTD9FFtroeRBARrybw= Received: by filter0533p1mdw1.sendgrid.net with SMTP id filter0533p1mdw1.21135.566FA1E82C 2015-12-15 05:15:20.752338244 +0000 UTC Received: from herokuapp.com (ec2-23-20-82-66.compute-1.amazonaws.com [23.20.82.66]) by ismtpd0002p1iad1.sendgrid.net (SG) with ESMTP id SMp6llTARMW7H4ZEhpPASg for ; Tue, 15 Dec 2015 05:15:20.118 +0000 (UTC) Date: Tue, 15 Dec 2015 05:15:20 +0000 From: cary@swoveland.com To: ruby-core@ruby-lang.org Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Redmine-MailingListIntegration-Message-Ids: 46842 X-Redmine-Project: ruby-trunk X-Redmine-Issue-Id: 11815 X-Redmine-Issue-Author: CaryInVictoria X-Redmine-Sender: CaryInVictoria X-Mailer: Redmine X-Redmine-Host: bugs.ruby-lang.org X-Redmine-Site: Ruby Issue Tracking System X-Auto-Response-Suppress: All Auto-Submitted: auto-generated X-SG-EID: ync6xU2WACa70kv/Ymy4QrNMhiuLXJG8OTL2vJD1yS7PNqjrj532Nnea+vTP1TY3uNmK6oH3I2IuE2 7gDh7AI3FVL/2p8WtyPQoO2ehwFhb6W+B0opHjGRSsOIES8E3XB96sZc8PKvRGrssdP0ISkqlWuz+J 41zy4sLNLwDBtWH27Ytlb7qSl9oXQgsNUYsZZAOLF1FWyMCn9Ne7Fj/jcw== X-ML-Name: ruby-core X-Mail-Count: 72135 Subject: [ruby-core:72135] [Ruby trunk - Feature #11815] Proposal for method `Array#difference` X-BeenThere: ruby-core@ruby-lang.org X-Mailman-Version: 2.1.15 Precedence: list Reply-To: Ruby developers List-Id: Ruby developers List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: ruby-core-bounces@ruby-lang.org Sender: "ruby-core" Issue #11815 has been updated by Cary Swoveland. Matz, alas, I cannot offer one. You see, Ruby--coding generally--is just a hobby for me. I spend a fair bit of time answering Ruby questions on SO and would have reached for this method on many occasions had it been available. Perhaps readers with development experience (everybody but me?) could reflect on whether this method would have been useful in projects they've worked on. ---------------------------------------- Feature #11815: Proposal for method `Array#difference` https://bugs.ruby-lang.org/issues/11815#change-55546 * Author: Cary Swoveland * Status: Open * Priority: Normal * Assignee: ---------------------------------------- I propose that a method `Array#difference` be added to the Ruby core. It is similar to [Array#-](http://ruby-doc.org/core-2.2.0/Array.html#method-i-2D) but for each element of the (array) argument it remove only one matching element from the receiver. For example: a = [1,2,3,4,3,2,2,4] b = [2,3,4,4,4] a - b #=> [1] c = a.difference b #=> [1, 3, 2, 2] As you see, `a` contains three `2`'s and `b` `1`, so the first `3-1 #=> 2` `2`'s in `a` have been removed from `a` in constructing `c`. When `b` contains as least as many instances of an element as does `a`, `c` contains no instances of that element. It could be implemented as follows: class Array def difference(other) dup.tap do |cpy| other.each do |e| ndx = cpy.index(e) cpy.delete_at(ndx) if ndx end end end end Here are a few examples of its use: *Identify an array's non-unique elements* a = [1,3,2,4,3,4] u = a.uniq #=> [1, 2, 3, 4] u - a.difference(u) #=> [1, 2] *Determine if two words of the same size are anagrams of each other* w1, w2 = "stop", "pots" w1.chars.difference(w2.chars).empty? #=> true *Identify a maximal number of 1-1 matches between the elements of two arrays and return an array of all elements from both arrays that were not matched* a = [1, 2, 4, 2, 1, 7, 4, 2, 9] b = [4, 7, 3, 2, 2, 7] a.difference(b).concat(b.difference(a)) # => [1, 1, 4, 2, 9, 3, 7] To remove elements from `a` starting at the end (rather the beginning) of `a`: a = [1,2,3,4,3,2,2,4] b = [2,3,4,4,4] a.reverse.difference(b).reverse #=> [1,2,3,2] `Array#difference!` could be defined in the obvious way. -- https://bugs.ruby-lang.org/