堆栈 Class 分隔元素

Stack Class seperating elements

大家好,我正在尝试编写删除代码

用户键入字符串时的元音和辅音

但我似乎在代码上失败了,我需要使用堆栈 class 来做到这一点

示例输出应该是这样的,并且会忽略非字母字符

输入字符串:hello1234!@#$

元音:eo

辅音:hll

最终内容:1234!@#$

谁能修复我的代码

这是我得到的错误 enter image description here

import java.util.Scanner;
import java.util.Stack;
public class PushPop 
{

//I used the push and pop methods

    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);
        
        System.out.print("Enter a String: ");
        String str = sc.nextLine();
        
        
        Stack<String> String = new Stack();
        
        String.push(str);
        
        String vowels = String.pop();
        vowels = vowels.replace("[aeiou]", "");
            
        String consonants = String.pop();
        consonants = consonants.replace("[qbcdfghjklmnpqrstvwxyz]", "");
        
        System.out.println("Vowels: "+ vowels);
        System.out.print("Consonant: "+ consonants);
        
        //this will print what is left after popping the elements
        System.out.print("Final contents: "+ str);
        
    }

}

如果您只想从用户输入中删除所有元音和辅音,则不需要 Stack(至少如果您使用现成的 Java 的 Pattern某种程度上来说)。事实上,你得到 Exception 是因为你尝试从 Stackpop 两次,而只 pushed 一次。特别是你首先 push 用户的输入 str,然后 pop 它到变量 vowels (所以 Stack 现在是空的)然后你 pop 再次从它,这次进入变量 consonants.


vowels = vowels.replace("[aeiou]", "");

根据 replace 的文档,它将用第二个参数替换所有 文字 。这意味着它将用空 String 替换所有与文字 "[aeiou]" 匹配的 String(如果它存在于用户输入中)。相反,您应该使用 replaceAll 方法,该方法将 regex(即正则表达式)作为第一个参数:

str = str.replaceAll("[aeiou]", "");

虽然您想先从用户输入中删除元音,然后从 that String(这是用户通过删除所有元音输入的结果)也删除辅音。所以逻辑应该是:

String str = sc.nextLine(); //Get user input.
str = str.replaceAll("[aeiou]", ""); //Remove vowels.
str = str.replaceAll("[qbcdfghjklmnpqrstvwxyz]", ""); //Remove consonants.
System.out.println(str); //Print result.

如果将两个正则表达式组合在一个操作中,可以缩短为:

String str = sc.nextLine();
str = str.replaceAll("[aeiouqbcdfghjklmnpqrstvwxyz]", "");
System.out.println(str);

如果您意识到这些都是字母,还可以进一步缩短:

str = str.replaceAll("[a-z]", "");

如果你还想要大小写字母,那么你可以这样做:

str = str.replaceAll("[a-zA-Z]", "");

相当于:

str = str.replaceAll("\p{Alpha}", "");

如果有人阅读了有关如何构建 Java Pattern 的文档,那么所有这些示例都可以让他们清楚,所以如果您没有阅读过文档,那么看看那里可能会有所帮助已经知道了。


i need to use a stack class to do it

您能否解释一下所需的行为是什么,以及如何使用 Stack 需要?因为您似乎只想删除所有字母。您是否需要为此使用正则表达式?