Search for duplicate elements in the array

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+=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?

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