G.A
G.A

Reputation: 27

Counting matching characters on a string

I have been asked to created a program that asks the user for two inputs, both of which have to be stored as strings. The first input can be one or multiple words, and the second input has to be one sole character. After the user enters both inputs the program should count how many times, if any, the sole charter appears in the first string. Once the iteration through the first string is done the program should then output the number of instances of the second string. Example:

"There is 1 occurrence(s) of 'e' in test."

The program must use the a while loop and string values. This is the solution I have as of right now following the parameters established by the professor

public static void main(String[] args) {
        String inputEntry; // User's word(s)
        String inputCharacter; // User's sole character
        String charCapture; // Used to create subtrings of char
        int i = 0; // Counter for while loop
        int charCount = 0; // Counter for veryfiying how many times char is in string
        int charCountDisplay = 0; // Displays instances of char in string
        Scanner scan = new Scanner(System.in);

        System.out.print("Enter some words here: "); // Captures word(s)
        inputEntry = scan.nextLine(); 

        System.out.print("Enter a character here: "); // Captures char
        inputCharacter = scan.nextLine();

        if (inputCharacter.length() > 1 ||  inputCharacter.length() < 1) // if user is not in compliance
        {
            System.out.print("Please enter one character. Try again.");
            return; 
        } 
         else if (inputCharacter.length() == 1) // if user is in compliance
         {
          while( i < inputEntry.length()) // iterates through word(s)
           {
              charCapture = inputEntry.substring(charCount); // Creates substring of each letter in order to compare to char entry
                    if (charCapture.equals(inputCharacter))
                    {
                        ++charCountDisplay;

                    }

                    ++charCount;  
                    ++i;
            }

          System.out.print("There is " + charCountDisplay + 
                  " occurrence(s) of " + inputCharacter + " in the test.");

         }



        }

This iteration has a bug. Instead of counting all the instances of the inputCharacter variable it only counts up to one, regardless of how many instances appear on the string. I know the problem is in this part of the code:

while( i < inputEntry.length()) // iterates through word(s)
           {
              charCapture = inputEntry.substring(charCount); // Creates substring of each letter in order to compare to char entry
                    if (charCapture.equals(inputCharacter))
                    {
                        ++charCountDisplay;

                    }

                    ++charCount;  
                    ++i;
            }

I just can't quiet pin down what I'm doing wrong. It seems to me that the charCountDisplay variable reverts to zero after each iteration. Isn't that supposed to be avoided by declaring the variable at the very beginning?... I'm one confused fellow.

Upvotes: 0

Views: 986

Answers (3)

paulsm4
paulsm4

Reputation: 121869

Here is a complete MVCE:

package com.example.countcharacters;

/**
 * EXAMPLE OUTPUT:
 * Enter some words here: 
 * How now brown cow
 * Enter a character here: 
 * abc
 * Please enter one character. Try again.
 * Enter a character here: 
 * o
 * There are 4 occurrence(s) of o in the text How now brown cow.
 */
import java.util.Scanner;

public class CountCharacters {

    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        // Captures word(s)
        String inputEntry;
        System.out.println("Enter some words here: "); 
        inputEntry = scan.nextLine(); 

        // Captures char
        char inputCharacter;    
        while (true) {
            System.out.println("Enter a character here: ");
            String line = scan.nextLine();
            if (line.length() == 1) {
                inputCharacter = line.charAt(0);
                break;
            } else {
                // if user is not in compliance
                System.out.println("Please enter one character. Try again.");
            }
        } 
            
        // iterates through word(s)
        int charCountDisplay = 0;
        int i = 0;
        while(i < inputEntry.length())  {
            char c = inputEntry.charAt(i++);
            if (c == inputCharacter) {
                ++charCountDisplay;
            }
        }

        // Print results
        System.out.print("There are " + charCountDisplay + 
            " occurrence(s) of " + inputCharacter + 
            " in the text " + inputEntry + ".");
    }

}

NOTES:

  • You can use "char" and "String.charAt()" to simplify your code.
  • In general, it's preferable to declare variables close to where you use them (rather than at the top).
  • You can put your test for "one character only" in its own loop.

Upvotes: 0

Viveksuriyan
Viveksuriyan

Reputation: 69

inputEntry.chars().filter(tempVar -> tempVar == inputCharacter).count() will give you the number of occurrences of a character in the string.

String inputEntry = "text";
char inputCharacter = 'x';
System.out.print("There is " + inputEntry.chars().filter(tempVar -> tempVar == inputCharacter).count() + " occurrence(s) of " + inputCharacter + " in the text " + inputEntry + ".");

Upvotes: 1

Scary Wombat
Scary Wombat

Reputation: 44854

This is wrong

charCapture = inputEntry.substring(charCount);

does not return one char

try using inputEntry.charAt(charCount)

Another hint is to define your variables close to where you use them rather than at the top of your method like:

String inputEntry; 
inputEntry = scan.nextLine(); 

Even better would be to do inline

String inputEntry = scan.nextLine(); 

It will make your code a lot more concise and readable.

A more concise way to do your code is:

Scanner scan = new Scanner(System.in);

System.out.print("Enter some words here: "); // Captures word(s)
String inputEntry = scan.nextLine(); 

System.out.print("Enter a character here: "); // Captures char
String inputCharacter = scan.nextLine();

// validate

// then

int len = inputEntry.length();
inputEntry = inputEntry.replace(inputCharacter, "");
int newlen = inputEntry.length();
System.out.format("There is %d occurrence(s) of %s in the test.%n", 
                                            len - newlen, inputCharacter);

output

Enter some words here: scarywombat writes code
Enter a character here: o
There is 2 occurrence(s) of o in the test.

Upvotes: 2

Related Questions