Mouse
Mouse

Reputation: 29

Getting each letter in a String only once

I'm writing a Java program for Horspool's algorithm, and am having a bit of trouble. I'm trying to create an array of chars that will hold each letter in a string, but I don't want duplicates of the letters. Right now this is my code:

public static void main(String[] args) 
{
    Scanner scanIn = new Scanner (System.in);

    int count = 0;

    int count2 = 0;

    int inc = 0;

    //The text to search for the phrase in
    String t = "";

    //The phrase/pattern to search for
    String p = "";

    System.out.println(" ");
    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    System.out.println("Harspool's Algorithm: ");
    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    System.out.println(" ");
    System.out.println("Please enter the full text: ");
    t = scanIn.nextLine();
    System.out.println("Please enter the pattern to search for: ");
    p = scanIn.nextLine();

    char[] text = new char[t.length()];
    char[] pattern = new char[p.length()];
    char[] alphabet = new char[t.length()];

    for (int i = 0; i < alphabet.length; i++)
    {
        alphabet[i] = ' ';
    }


    for (int i = 0; i < text.length; i++)
    {
        text[i] = t.charAt(i);
    }

    for (int i = 0; i < pattern.length; i++)
    {
        pattern[i] = p.charAt(i);
    }

    while (inc < text.length)
    {
        for (int j = 0; j < text.length; j++)
        {
            if (text[inc] != alphabet[j])
            {
                count++;
            }
            if (count == p.length() - 1 && count2 < text.length)
            {
                alphabet[count2] = text[inc];
                count2++;
                count = 0;
                inc++;
            }
        }
    }

    for (int i = 0; i < alphabet.length; i++)
    {
        System.out.print(alphabet[i]);
    }
}

I believe the problem is in the while loop, but I can't figure out what exactly is going wrong. Right now, it will print out the entire string passed in, when it should be printing each letter only once. Could someone please help?

Upvotes: 0

Views: 1974

Answers (2)

Floris
Floris

Reputation: 46415

Your code is not easy to read. You might consider using the following algorithm instead.

int ccount[256];
int ii;
for(ii=0;ii<256;ii++) ccount[ii]=0;
for (ii = 0; ii < text.length; ii++)
{
    ccount[t.charAt(i)%256]++;
}
for (ii = 0; ii<256; ii++) {
    if(ccount[ii]>0) System.out.printf("%c", ii);
}

EDIT - made sure ccount was initialized, and captured characters outside of range 0-255 with % operator.

Upvotes: 0

Vivin Paliath
Vivin Paliath

Reputation: 95568

Instead of counting the occurrences of each character, Use Set<Character>. A set contains unique elements and so you will not have duplicates that way.

You can also convert a Set to an array by doing mySet.toArray(new String[mySet.size()]); or just mySet.toArray(new String[0]);

Upvotes: 3

Related Questions