On Wed, Nov 4, 2009 at 4:19 PM, George George <george.githinji / gmail.com> wrote: > Given an array of arrays for example > [["A", "B"], ["A", "B", "D", "C"], ["B", "D"], ["B", "C", "F", "E"], > ["C", "F"], ["C", "E"], ["G"]] > > what would be a nice way of "merging" the items that seem to already be > contained in another array. e.g. > ["A","B"] and ["B", "D"] are subsets of ["A", "B", "D", "C"] I would > like to drop the subsets ¨Âîä âå ìåæô ÷éôè Û¢Á¢¢Â¢¬ ¢Ä¢¬ ¢Ã¢Ý ïîìù Here are two ways: require 'set' # -------------------------------------------------------------- # method 1: sets = [["A", "B"], ["A", "B", "D", "C"], ["B", "D"], ["B", "C", "F", "E"], ["C", "F"], ["C", "E"], ["G"]] sets = sets.map {|x| x.to_set}.sort_by {|x| -x.size} (0...(sets.length)).each do |i| next unless sets[i] ((i+1)...(sets.length)).each do |j| sets[j] = nil if sets[j] && sets[j].subset?(sets[i]) end end sets = sets.compact.map {|x| x.to_a} p sets # -------------------------------------------------------------- # method 2: sets = [["A", "B"], ["A", "B", "D", "C"], ["B", "D"], ["B", "C", "F", "E"], ["C", "F"], ["C", "E"], ["G"]] sets = sets.map {|x| x.to_set}.sort_by {|x| -x.size} i = 0 while i < sets.length ((i+1)...(sets.length)).each do |j| sets[j] = nil if sets[j].subset?(sets[i]) end sets.compact! i += 1 end sets = sets.map {|x| x.to_a} p sets martin