Ruhe
(Ruhe)
16 September 2007 11:05
1
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?
Robert_K1
(Robert K.)
16 September 2007 11:35
2
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 +=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 +=1; d}.select {|k,v| v>1}
Kind regards
robert
···
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?
Ruhe
(Ruhe)
16 September 2007 12:15
3
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.
···
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 +=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 +=1; d}.select {|k,v| v>1}
Kind regards
robert