Sam_Cameron
Sam_Cameron

Reputation: 105

Check for same vowel twice in a row

I'm trying to write a program (really a section of a program) that checks to see if any vowels recur twice in a row. For ex. input = boo, output = o

This is the code I have so far for this:

//j - displays any vowels which occur consecutively
System.out.print("\nj. ");

// have to give these variables a value
// otherwise the default statements won't work
char current_letter_1 = ' ', current_letter_2 = ' ';

//making strings for these characters so they are easier to output
String current_letter_1_string = String.valueOf(current_letter_1);
String current_letter_2_string = String.valueOf(current_letter_2);

//checking it against the sentence in lowercase so it's case insensitive
char low_letter = e.charAt(ind);

while (ind < a) {
    current_letter_1_string = String.valueOf(current_letter_1);
    current_letter_2_string = String.valueOf(current_letter_2);

    low_letter = e.charAt(ind);

    switch (low_letter) {
        case 'a', 'e', 'i', 'o', 'u', 'y':
            current_letter_1 = low_letter;
            break;
        default:
            break;
    }
    ind += 1;
    switch (low_letter) {
        case 'a', 'e', 'i', 'o', 'u', 'y':
            current_letter_2 = low_letter;
            break;
        default:
            break;
    }
    if (current_letter_1 == current_letter_2) {
        System.out.print(current_letter_2_string.trim() + " ");
    } else {
    }
    //in case the same vowel is repeated more than twice in a row
}
while (low_letter == current_letter_2 && ind < a) {
    low_letter = e.charAt(ind);
    ind += 1;
}
if (low_letter != current_letter_2) {
    ind += 1;
} else {
}

Btw since this is a subsections of a larger program I'll give you some variable values:

Scanner sc(System.in);
String sentence = sc.nextLine();
int a = sentence.length();
String e = sentence.toLowerCase();
int ind = 0;

Also, this is for school so if it looks really weird and you would do this completely differently, bear with me. This code sort of works, but the output is always weird, even with trim(), the variable is still outputted with space in front of it. Also, if sentence contains more than one repeated vowel, the output is screwed up again. Any help is much appreciated.

Upvotes: 1

Views: 304

Answers (3)

WJS
WJS

Reputation: 40062

Another possibility is to use regular expressions (something that you may want to get familiar with as you continue to learn Java).

Test Data

String[] data =
        { "boo", "hello", "vacuUm", "keenly", "weedprOof" };
        

The pattern. It looks for any vowel followed by the same vowel.

  • the (?i:) ignores case in matches.
  • the ([aeiou]) is a vowel capture group
  • the (?=\\1) is a zero width lookahead for the previously matched vowel from the capture block (all this is explained in the link above).
Pattern p = Pattern.compile("(?i:)([aeiou])(?=\\1)");

Now just iterate over the words, looking for one or more pattern matches for each word. This prints one letter for each pair found, including patterns like eee which would be two pair of e's

for (String d : data) {
    Matcher m = p.matcher(d);
    System.out.printf("%-10s -> ", d);
    boolean match = false;
    while (m.find()) {
        match = true;
        System.out.print(m.group(1) + " ");
    }
    System.out.println(match ? "" : "none found.");
}

Or the non regex approach

String[] data =
        { "boo", "hello", "vacuUm", "keenly", "weedprOof" };

for (String d : data) {
    String orig = d;
    char[] chs = d.toLowerCase().toCharArray();
    System.out.printf("%-10s -> ", orig);
    boolean match = false;
    for (int i = 0; i < chs.length - 1; i++) {
        if ("aeiou".indexOf(chs[i]) >= 0) {
            if (chs[i] == chs[i + 1]) {
                match = true;
                System.out.print(chs[i] + " ");
            }
        }
    }
    System.out.println(match ? "" : "none found.");
    
}

Both print

boo        -> o 
hello      -> none found.
vacuUm     -> u 
keenly     -> e 
weedprOof  -> e o 

Upvotes: 0

Sam_Cameron
Sam_Cameron

Reputation: 105

Here is the full code:

import java.util.Scanner;
//also using java.lang.StringBuilder and java.lang.Character

public class Ch6Extra1 {

    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        String sentence;
        
        
        do {
            System.out.print("Enter a sentence: ");
            sentence = sc.nextLine();
            
        } while (sentence.equals(null) || sentence.equals(""));
            
        
        //variables used throughout code
        int ind = 0;
        char letter = sentence.charAt(ind);
        
        //a - character counter
        int a;
        a = sentence.length();
        
        System.out.print("\na. " + a);
        
        //b - word counter
        int b;
        b = 0;
        
        while (ind < a) {
            
            letter = sentence.charAt(ind);
            
            switch (letter) {
                
                case ' ':
                    b += 1;
                    break;
                    
                default:
                    break;
            }
            ind += 1;
        }
        b += 1;
        ind = 0;
        
        System.out.print("\nb. " + b);
        
        //c - sentence reversed
        StringBuilder c = new StringBuilder(sentence);
        StringBuilder rev_sentence = c.reverse();
        
        System.out.print("\nc. " + rev_sentence);
        
        //d - sentence to uppercase
        String d;
        d = sentence.toUpperCase();
        
        System.out.print("\nd. " + d);
        
        //e - sentence to lowercase
        String e;
        e = sentence.toLowerCase();
        
        System.out.print("\ne. " + e);
        
        //f, g and m - vowel, consonant, and punctuation count
        int f, g, m;
        f = 0;
        g = 0;
        m = 0;
        ind = 0;
        
        while (ind < a) {
            
            letter = sentence.charAt(ind);
            
            switch (letter) {
                case 'a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y':
                    f += 1;
                    break;
                    
                //in case it's a number, the code will pass to the next char
                case 1, 2, 3, 4, 5, 6, 7, 8, 9:
                    break;
                 
                //in case it's a special character, the code will pass to the next char
                case 'b', 'B', 'c', 'C', 'd', 'D', 'f', 'F', 'g', 'G', 'h', 'H', 
                     'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'p', 'P', 
                     'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'v', 'V', 'w', 'W', 
                     'x', 'X', 'z', 'Z':
                    g += 1;
                    break;
                    
                //checks for punctuation
                case '.', ',', ';', ':', '?', '!':
                    m += 1;
                    break;
                    
                default:
                    break;
                    
            }
            ind += 1;
        }
        
        System.out.print("\nf. " + f);
        System.out.print("\ng. " + g);
        ind = 0;
        
        
        //h - ASCII of first word
        
        System.out.print("\nh. ");
        while (ind < a) {
            
            letter = sentence.charAt(ind);
            
            switch (letter) {
                
                case ' ':
                    ind = a -1;
                    break;
                    
                default:
                    System.out.print((int)letter + " ");
                    break;
            }
            ind += 1;
        }
        ind = 0;
        
        //i - checks for word and in the sentence
        boolean i = e.contains("and");
        
        if (i == true) {
            System.out.print("\ni. Yes");
        } else if (i == false) {
            System.out.print("\ni. No");
        }
        
        
        //j - displays any vowels which occur consecutively
        
        System.out.print("\nj. ");
        
        //have to give these variables a value otherwise the default statements won't work
        char current_letter_1 = ' ', current_letter_2 = ' ';
        
        //making strings for these characters so they are easier to output
        String current_letter_1_string  = String.valueOf(current_letter_1);
        String current_letter_2_string  = String.valueOf(current_letter_2);
        
        //checking it against the sentence in lowercase so it's case insensitive
        char low_letter = e.charAt(ind);
        
        while (ind < a) {
            
            current_letter_1_string  = String.valueOf(current_letter_1);
            current_letter_2_string  = String.valueOf(current_letter_2);
            
            low_letter = e.charAt(ind);
            
        
            switch (low_letter) {
                case 'a', 'e', 'i', 'o', 'u', 'y':
                    current_letter_1 = low_letter;
                    break;
                    
                default:
                    break;
                    
            }
            ind += 1;
            
            switch (low_letter) {
                case 'a', 'e', 'i', 'o', 'u', 'y':
                    current_letter_2 = low_letter;
                    break;
                    
                default:
                    break;
                    
                    
            } if (current_letter_1 == current_letter_2) {
                System.out.print(current_letter_2_string.trim() + " ");
                
            } else {
            }
                
            //in case the same vowel is repeated more than twice in a row
            } while (low_letter == current_letter_2 && ind < a){
                low_letter = e.charAt(ind);
                ind += 1;
                
            } if (low_letter != current_letter_2) {
                ind += 1;
            } else {
            }
        
        
        //k and l together - Upper and Lower case counters
        int k, l;
        k = 0;
        l = 0;
        
        boolean up_case = Character.isUpperCase(letter);
        boolean low_case = Character.isUpperCase(letter);
        
        while (ind < a) {
            
            up_case = Character.isUpperCase(letter);
            low_case = Character.isLowerCase(letter);
            letter = sentence.charAt(ind);
            
            if (up_case == true) {
                k += 1;
                
            } else if (up_case == false) {
                if (low_case == true) {
                        l += 1;
                        
                } else {
                }
                    
            } else {
            }
            ind += 1;
        }
        
        System.out.print("\nk. " + k);
        System.out.print("\nl. " + l);
        
        System.out.print("\nm. " + m);
        System.out.println("\n");
        
    }
}

I see someone posted an answer. I'll try that and checkmark it if it works.

Upvotes: 0

Arvind Kumar Avinash
Arvind Kumar Avinash

Reputation: 79395

Keep it simple.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a text: ");
        String sentence = sc.nextLine();

        // Text in the lower case
        String sentenceLowerCase = sentence.toLowerCase();

        // Check all but the last char if it is same as its following character and if
        // it's a vowel
        for (int i = 0; i < sentence.length() - 1; i++) {
            char ch = sentenceLowerCase.charAt(i);
            if (ch == sentenceLowerCase.charAt(i + 1)
                    && (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')) {
                System.out.println(ch);
            }
        }
    }
}

A sample run:

Enter a text: Booster and rooster are different things
o
o

Another sample run:

Enter a text: Faaster is a wrong spelling. Boost your vocabulary.
a
o

Upvotes: 1

Related Questions