[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Search for duplicate elements in the array

Ruhe

9/16/2007 11:04:00 AM

Hello.
I have a pretty good working Java method, which sorts array of
strings, then searches for duplicate elements. If element is
duplicated output shows ">> hello *20 times" for example.

private void printArray()

{

String arr[] = str.split("\\n+");



Arrays.sort(arr);



for (int j = 0; j < arr.length; j++)

{

int count = 1;

for (int i = j + 1; i < arr.length; i++)

{

if (arr[i].compareTo(arr[j]) == 0)

{

count++;

j++;

}

}

if (count > 1)

{

System.out.println(">> " + arr[j] + " *" + count + " times");

} else

{

System.out.println(">> " + arr[j]);

}

}

}


But the problem is that I can't write this method in Ruby! How to make
this in Ruby?

2 Answers

Robert Klemme

9/16/2007 11:33:00 AM

0

On 16.09.2007 13:04, Ruhe wrote:
> Hello.
> I have a pretty good working Java method, which sorts array of
> strings, then searches for duplicate elements. If element is
> duplicated output shows ">> hello *20 times" for example.
>
> private void printArray()
>
> {
>
> String arr[] = str.split("\\n+");
>
>
>
> Arrays.sort(arr);
>
>
>
> for (int j = 0; j < arr.length; j++)
>
> {
>
> int count = 1;
>
> for (int i = j + 1; i < arr.length; i++)
>
> {
>
> if (arr[i].compareTo(arr[j]) == 0)
>
> {
>
> count++;
>
> j++;
>
> }
>
> }
>
> if (count > 1)
>
> {
>
> System.out.println(">> " + arr[j] + " *" + count + " times");
>
> } else
>
> {
>
> System.out.println(">> " + arr[j]);
>
> }
>
> }
>
> }
>
>
> But the problem is that I can't write this method in Ruby! How to make
> this in Ruby?

This is way inefficient. You rather want a counter per element stored
in a Map (HashMap or TreeMap in Java).

dups = Hash.new 0
arr.each {|x| dups[x]+=1}
puts dups.select {|k,v| v>1}

You can have it on one line if you prefer:

puts arr.inject(Hash.new(0)) {|d,x| d[x]+=1; d}.select {|k,v| v>1}

Kind regards

robert

Ruhe

9/16/2007 12:14:00 PM

0

On 16 , 15:32, Robert Klemme <shortcut...@googlemail.com> wrote:
> This is way inefficient. You rather want a counter per element stored
> in a Map (HashMap or TreeMap in Java).
>
> dups = Hash.new 0
> arr.each {|x| dups[x]+=1}
> puts dups.select {|k,v| v>1}
>
> You can have it on one line if you prefer:
>
> puts arr.inject(Hash.new(0)) {|d,x| d[x]+=1; d}.select {|k,v| v>1}
>
> Kind regards
>
> robert

Thanks a lot! This is a new level of programing knowledge for me.
I'll try to make something like this with HashMap in Java.