堆栈 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
是因为你尝试从 Stack
中 pop
两次,而只 push
ed 一次。特别是你首先 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
需要?因为您似乎只想删除所有字母。您是否需要不为此使用正则表达式?
大家好,我正在尝试编写删除代码
用户键入字符串时的元音和辅音
但我似乎在代码上失败了,我需要使用堆栈 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
是因为你尝试从 Stack
中 pop
两次,而只 push
ed 一次。特别是你首先 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
需要?因为您似乎只想删除所有字母。您是否需要不为此使用正则表达式?