我刚刚学习Stacks,Queues和Deques,所以这对我来说都是全新的。
我找到了this链接,解释了如何使用带有向量的正则表达式,但它是用于R语言的,而且我没有运气在这个类中找到Java中的正则表达式的任何实现。
如果我只是想从堆栈中删除括号,这在Java中是否可行?
我试过
Stack stack = new Stack();
stack.push("Item1");
stack.push("Item2");
stack.push("Item3");
stack = stack.replaceAll(\\[", "").replaceAll("\\]", "");
然而我得到编译器错误
method.java.util.Vector.replaceAll(java.util.function.UnaryOperator)
is not applicable(actual and formal argument lists differ in length)
所以,我想过如何在没有使用正则表达式的情况下打印不带括号的ArrayList中的每个项目,我只是为每个循环做了一个,就像这样:
for(Object item : stack)
System.out.print(item + " ");
返回
Item1 Item2 Item3
答案 0 :(得分:1)
您所指的“来自Stack
的括号”实际上并不是Stack
本身的一部分。相反,它们是调用String
的{{1}}方法时生成的Stack
的一部分。如果您希望能够修改它,则需要调用相同的方法:
toString
调用String stackStr = stack.toString().replaceAll("\\[", "").replaceAll("\\]", "");
或print
时您不需要执行此操作的原因是因为这些方法有一个需要println
的重载方法,会调用Object
对你而言。
或者,你也可以像你一样使用循环。这样会更容易理解。
答案 1 :(得分:1)
堆栈中实际上没有括号。它们是由toString
方法生成的,当您println
堆栈时会自动调用它,因此您需要在对生成的字符串执行替换之前手动调用它。
您实际上不需要使用正则表达式来执行此纯字符串替换。如果您使用String.replace
,这是String.replaceAll
的非正则表达式版本,则无需转义括号。 (String.replaceAll
方法经常被不必要地使用,因为它的命名很差。)
System.out.print(theStack.toString().replace("[", "").replace("]", ""));
但是,您根本不应该使用字符串替换,因为如果堆栈中的任何项本身包含括号,则会产生错误的结果。您可以通过执行类似str.replaceAll("^\\[|\\]\\z", "")
或str.substring(1, str.length() - 1)
的操作来解决这个问题,但它很麻烦,但在这种情况下仍然无法匹配您的手动循环,因为它不会删除项目之间的逗号。所以用字符串捏造是错误的。
如果要控制生成的字符串,正确的方法是首先正确生成字符串。 E.g:
StringBuilder sb = new StringBuilder();
for (Object item : stack) {
if (sb.length() > 0) sb.append(" ");
sb.append(item);
}
System.out.println(sb.toString());
你也可以在这里使用String.join
,因为你的堆栈中的所有项目都已经是字符串。 (String.join
将在运行时生成异常,如果集合中的任何对象不是String
或CharSequence
。) 在声明时指定堆栈的项类型为了更好的类型安全。 E.g:
Stack<String> stack = new Stack<>();
/* ... add items ... */
System.out.println(String.join(" ", stack));
如果不是所有项目都是字符串,您可以将它们映射到字符串并以这种方式将它们连接在一起:
System.out.println(stack.stream().map(String::valueOf).collect(Collectors.joining(" ")));
P.S。自从Java 5于2004年问世以来,java.util.Stack
已经过时了。在新代码中,您应该用ArrayDeque
或LinkedList
替换它。所有上述代码与这些类的作用相同,尽管它们具有其他不同的特性和性能特征。
答案 2 :(得分:-1)
如果我在问之前再等几分钟,我就不需要在第一时间发帖了。我弄清楚了:
System.out.print(theStack.toString().replaceAll("\\[", "").replaceAll("\\]", ""));