Removing duplicates and substrings from an array

S

Sam Larbi

Note: parts of this message were removed by the gateway to make it a legal Usenet post.

I've got an array of strings, say like:

["Bob", "John", "Bobby", "John"]

I want to remove duplicates and elements that are substrings of other
elements. Therefore, the above array would become:

["John","Bobby"]

(order doesn't really matter to me, BTW)

Right now, this is what I'm doing:

def remove_duplicates_and_subsequences(some_array)
result = []
some_array.each_index do |i|
(some_array.length-1).downto 0 do |j|
some_array.delete_at(j) if i != j &&
some_array.index(some_array[j])
end
end
return result
end

Is there a better way to do that? I feel like I should be using select or
reject, but can't think of a way to do it.

Thanks,
Sammy Larbi
 
S

Siep Korteling

Sam said:
I've got an array of strings, say like:

["Bob", "John", "Bobby", "John"]

I want to remove duplicates and elements that are substrings of other
elements. Therefore, the above array would become:

["John","Bobby"]

["Bob", "John", "Bobby", "John"].uniq!

(or uniq )
 
S

Shairon Toledo

Sam said:
I've got an array of strings, say like:

["Bob", "John", "Bobby", "John"]

I want to remove duplicates and elements that are substrings of other
elements. Therefore, the above array would become:

["John","Bobby"]

(order doesn't really matter to me, BTW)

Right now, this is what I'm doing:

def remove_duplicates_and_subsequences(some_array)
result = []
some_array.each_index do |i|
(some_array.length-1).downto 0 do |j|
some_array.delete_at(j) if i != j &&
some_array.index(some_array[j])
end
end
return result
end

Is there a better way to do that? I feel like I should be using select
or
reject, but can't think of a way to do it.

Thanks,
Sammy Larbi



You tried to use the method uniq?
<code>
[1,2,3,4,1,3].uniq => [1,2,3,4]
</code>
 
M

Marc Heiler

I think there could also be a .map solution but I cant figure it out
right now, .uniq just really seems the most simple and elegant for this
given problem at hand
 
Y

yermej

Note: parts of this message were removed by the gateway to make it a legal Usenet post.

I've got an array of strings, say like:

["Bob", "John", "Bobby", "John"]

I want to remove duplicates and elements that are substrings of other
elements. Therefore, the above array would become:

["John","Bobby"]

(order doesn't really matter to me, BTW)

Right now, this is what I'm doing:

def remove_duplicates_and_subsequences(some_array)
result = []
some_array.each_index do |i|
(some_array.length-1).downto 0 do |j|
some_array.delete_at(j) if i != j &&
some_array.index(some_array[j])
end
end
return result
end

Is there a better way to do that? I feel like I should be using select or
reject, but can't think of a way to do it.

Thanks,
Sammy Larbi


This should work:

arr = ["Bob", "John", "Bobby", "John"]
arr.uniq!
arr.reject {|a| arr.any? {|b| b != a and b =~ /#{a}/}}

Jeremy
 
L

Lionel Bouton

yermej wrote the following on 26.11.2007 18:15 :
Note: parts of this message were removed by the gateway to make it a legal Usenet post.

I've got an array of strings, say like:

["Bob", "John", "Bobby", "John"]

I want to remove duplicates and elements that are substrings of other
elements. Therefore, the above array would become:

["John","Bobby"]
This should work:

arr = ["Bob", "John", "Bobby", "John"]
arr.uniq!
arr.reject {|a| arr.any? {|b| b != a and b =~ /#{a}/}}

You'll have surprises if there's a "." element...

arr = ["Bob", "John", "Bobby", "John"]
arr.uniq!
arr.reject {|a| arr.any? {|b| b != a and a.index(b) } }


seems safer and quicker to me.

Lionel
 
L

Lionel Bouton

Lionel Bouton wrote the following on 26.11.2007 18:20 :
yermej wrote the following on 26.11.2007 18:15 :
Note: parts of this message were removed by the gateway to make it a legal Usenet post.

I've got an array of strings, say like:

["Bob", "John", "Bobby", "John"]

I want to remove duplicates and elements that are substrings of other
elements. Therefore, the above array would become:

["John","Bobby"]
This should work:

arr = ["Bob", "John", "Bobby", "John"]
arr.uniq!
arr.reject {|a| arr.any? {|b| b != a and b =~ /#{a}/}}

You'll have surprises if there's a "." element...

arr = ["Bob", "John", "Bobby", "John"]
arr.uniq!
arr.reject {|a| arr.any? {|b| b != a and a.index(b) } }

Oups: I misread the question.

It should be b.index(a) (I rejected the superstrings instead of the
substrings).

Lionel
 
S

Sebastian Hungerecker

Lionel said:
arr.reject {|a| arr.any? {|b| b != a and a.index(b) } }

I'd make that index into include? because you don't really care about the
index here.
 
Y

yermej

yermej wrote the following on 26.11.2007 18:15 :


Note: parts of this message were removed by the gateway to make it a legal Usenet post.
I've got an array of strings, say like:
["Bob", "John", "Bobby", "John"]
I want to remove duplicates and elements that are substrings of other
elements. Therefore, the above array would become:
["John","Bobby"]
This should work:
arr = ["Bob", "John", "Bobby", "John"]
arr.uniq!
arr.reject {|a| arr.any? {|b| b != a and b =~ /#{a}/}}

You'll have surprises if there's a "." element...

arr = ["Bob", "John", "Bobby", "John"]
arr.uniq!
arr.reject {|a| arr.any? {|b| b != a and a.index(b) } }

seems safer and quicker to me.

Lionel

Good point. Thank you.

Jeremy
 
L

Lionel Bouton

Sebastian Hungerecker wrote the following on 26.11.2007 18:27 :
I'd make that index into include? because you don't really care about the
index here.

I agree, the code is then easier to read too.

Lionel
 
S

Sam Larbi

Note: parts of this message were removed by the gateway to make it a legal Usenet post.

Everyone,


Sebastian Hungerecker wrote the following on 26.11.2007 18:27 :

I agree, the code is then easier to read too.

That's precisely what I was looking for (or felt like I should be doing).
Thanks to all for their help!

Sam
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top