Ortbay
Ortbay

Reputation: 11

Counting unique characters in a string

So i have been trying to make a code that counts the number of words in a string which was pretty easy. I'm running into problems when im trying to make it count the number of unique characters in a string. The program compiles and runs it doesn't display the number of Unique characters. Adding a System.out.println(countOfUniqueChars); below return doesn't work.

Here's the code:

public class Uniquechar{
public static void main(String[] args) {

    String s = "Jag vet inte vad jag heter idag";
    String[] parts = s.split(" ");
    int wordcount = parts.length;
    System.out.println("The number of words is" + wordcount);

    countUniqueCharacters(s);
}

public static int countUniqueCharacters(String s) {
    String lowerCase = s.toLowerCase();
    char characters[] = lowerCase.toCharArray();
    int countOfUniqueChars = s.length();
    for (int i = 0; i < characters.length; i++) {
        if (i != lowerCase.indexOf(characters[i])) {
            countOfUniqueChars--;
        }
    }
    return countOfUniqueChars;
}

Upvotes: 0

Views: 4352

Answers (8)

Amulya
Amulya

Reputation: 31

public static int countUniqueCharacters(String s) {
        char [] input=s.toCharArray();
        Set<Character> charset=new HashSet<>();
        for (int i = 0; i < input.length; i++) {
            charset.add(input[i]);
        }
        return charset.size();
    }

Upvotes: 0

Pshemo
Pshemo

Reputation: 124225

Adding a System.out.println(countOfUniqueChars); below return doesn't work.

That is expected behavior because return means that flow of control will be returned from method to place where this method was invoked. This means that code after return will not be executed, so in situation like

return countOfUniqueChars;
System.out.println(countOfUniqueChars);

System.out.println(countOfUniqueChars); would be dead code.

You could try printing value before you return it like

System.out.println(countOfUniqueChars);
return countOfUniqueChars;

or simply print returned value in main method like

int count = countUniqueCharacters(s);
System.out.println(count);

or using this one-liner

System.out.println(countUniqueCharacters(s));

BTW since Java 8 your code can look like

s.toLowerCase().chars().distinct().summaryStatistics().getCount()

or if you want to skip spaces you can add

s.toLowerCase().replace(" ","").chars().distinct().summaryStatistics().getCount()

Upvotes: 0

Andr&#233; Claudino
Andr&#233; Claudino

Reputation: 588

A good way to count the number of characters would be eliminating repetitions. The ideia is get the first character, then find next occurrences and replace by nothing, once you do that you can count the unique characters.

public static int countUniqueCharacters(String s) {
    String lowerCase = s.toLowerCase();

    ///Get the first char of lowerCase
    String firstChar = lowerCase.substring(0,1);
    //Take off the first char
    String subS = lowerCase.substring(1);
    ///replace all chars equals to first char
    String replacedSubS = subS.replace(firstChar, "");

    /// Now, call method again to calculate size
    /// of the substring with first char
    // replaced by blank char
    return  1+countUniqueCharacters(replacedSubS);
}

This method worked for me, take a look. You may do that in two lines, but i thought it's better be detailed here.

Upvotes: 0

kai
kai

Reputation: 6887

You can do System.out.println(countUniqueCharacters(s)); in the main method, to output the return value of your method. After a return, you cannot add more code. I did it for you and the output is 12, so it seems to be that there is also something wrong with your algorithm.

    int uniqeCharsCount = countUniqueCharacters(s);
    System.out.println("The number of uniqe chars is " + uniqeCharsCount);

Output: 12

Your algorithm:

Actually you are checking every char, if this char is one more time in the string before. But you should also check if the char is anywhere in the string after the current index. You can fix it if you change your if condition to if (i != lowerCase.indexOf(characters[i]) || i != lowerCase.lastIndexOf(characters[i]))

Output of the fixed version: 3 (n, h, r)

Upvotes: 0

ControlAltDel
ControlAltDel

Reputation: 35011

if (i != lowerCase.indexOf(characters[i])) {
    countOfUniqueChars--;
}

This is wrong. Your lowerCase string is lowercase, so any uppercase letters in characters[i] will have an index of -1 in lowerCase (will be calculated as a non-unique character). You can fix this by using indexOf(lowerCase.charAt(i));

Upvotes: 0

Mena
Mena

Reputation: 48404

I would recommend using a Set to retain only uniques, then count its size, instead of iterating:

public static int countUniqueCharacters(String s) {
    String lowerCase = s.toLowerCase();
    char characters[] = lowerCase.toCharArray();
    Set<Character> uniques = new HashSet<Character>();
    for (char c: characters) {
        uniques.add(c);
    }
    return uniques.size();
}

Upvotes: 0

Nicholas Robinson
Nicholas Robinson

Reputation: 1419

Try this:

s = s.replace(" ", ""); // If you don't want to count space
char[] chars = s.toCharArray();
Set<Character> uniqueChars = new HashSet<>();

for (char c : chars) {
   uniqueChars.add(c);
}

System.out.println(c.size());

Upvotes: 2

Suresh Atta
Suresh Atta

Reputation: 121998

Just print the method call, it prints the result.

   System.out.println(countUniqueCharacters(s));

Adding a System.out.println(countOfUniqueChars); below return doesn't work.

It won't work. Because the code after return statement is unreachable. Perhaps you can do it just before return.

System.out.println(countOfUniqueChars);
return countOfUniqueChars;

Upvotes: 1

Related Questions