Java,打印堆栈值

时间:2012-08-28 13:21:02

标签: java stack

在Java中,我想打印Stack的内容。 toString()方法将它们打印在用逗号分隔的方括号中:[foo, bar, baz]

问题是,如何摆脱它们并仅打印变量?

到目前为止我的代码:

Stack myStack = new Stack ();
for(int j=0;j<arrayForVar.length;j++) {
if(arrayForVar[j][1]!=null) {
  System.out.printf("%s \n",arrayForVar[j][1]+"\n");
  myStack.push(arrayForVar[j][1]);
}
System.out.printf("%s \n",myStack.toString());

这个答案对我有用:

在堆栈上使用toString方法,并使用replaceAll方法用blankstring替换方括号的所有实例。像这样:

System.out.print(
    myStack.toString().replaceAll("\\[", "").replaceAll("]", ""));

8 个答案:

答案 0 :(得分:10)

有一种解决方法。

您可以将其转换为数组,然后使用Arrays.toString(Object[])打印出来:

System.out.println(Arrays.toString(myStack.toArray()));

答案 1 :(得分:2)

使用您用于填充堆栈的相同类型的循环并根据自己的喜好打印单个元素。没有办法改变toString的行为,除非你走的是子类化Stack的路线,我不建议这样做。如果Stack的源代码在您的控制之下,那么只需修复toString的实现。

答案 2 :(得分:1)

使用toArray()打印堆栈值

public void printStack(Stack<Integer> stack) {

        // method 1:
        String values = Arrays.toString(stack.toArray());
        System.out.println(values);

        // method 2:
        Object[] vals = stack.toArray();
        for (Object obj : vals) {
            System.out.println(obj);
        }
    }

答案 3 :(得分:1)

另一种方法是String的"" + String.join("/", stack) 方法,它类似于Python的join方法:

.label {
  position: relative;
  display: inline-block;
  padding: .5rem .75rem;
  line-height: 1rem;
  color: white;
  background-color: darkred;
  box-sizing: border-box;
}
/*
.label:after {
  content: ' ';
  position: absolute;
  top: 0;
  right: -.5rem;
  border-top: 1rem solid transparent;
  border-left: .5rem solid darkred;
  border-bottom: 1rem solid transparent;
  box-sizing: border-box;
}
*/
.label:before,
.label:after {
  width: 1rem;
  height: 50%;
  position: absolute;
  left: 100%;
  content: "";
}

.label:before {
  top: 0px;
  background: -webkit-linear-gradient(left bottom, darkred 50%, rgba(0, 0, 0, 0) 50%);
  background: linear-gradient(to right top, darkred 50%, rgba(0, 0, 0, 0) 50%);
}

.label:after {
  top: 50%;
  background: -webkit-linear-gradient(left top, darkred 50%, rgba(0, 0, 0, 0) 50%);
  background: linear-gradient(to right bottom, darkred 50%, rgba(0, 0, 0, 0) 50%);
}

这将返回包含堆栈中所有元素的字符串,我们还可以通过传入第一个参数来添加一些定界符。

示例:堆栈具有两个元素[home,abc]

然后将返回“ / home / abc”。

答案 4 :(得分:0)

来自AbstractCollection的toString()方法的文档。除非你定义自己的Stack或者通过迭代Stack来实现自定义toString(),否则你不能这样做

public String toString()

  

返回此集合的字符串表示形式。字符串表示由一个集合元素的列表组成,它们的迭代器返回它们的顺序,用方括号(“[]”)括起来。相邻元素由字符“,”(逗号和空格)分隔。通过String.valueOf(Object)将元素转换为字符串。

     

此实现创建一个空字符串缓冲区,附加一个左方括号,并迭代遍历每个元素的字符串表示形式的集合。在追加除最后一个元素之外的每个元素之后,附加字符串“,”。最后附加右括号。从字符串缓冲区获取字符串,然后返回。

答案 5 :(得分:0)

在这里向游泳池投掷建议。根据您的Stack实现,这可能是也可能是不可能的。

该建议是一个匿名内部类,用于在这种特殊情况下覆盖toString()。这是本地实现Marko提到的子类化的一种方法。您的Stack实例化看起来像

Stack s = new Stack(){
              public String toString(){
                 // query the elements of the stack, build a string and
                 return nicelyFormattedString;
              }
          };
...

答案 6 :(得分:0)

stack.forEach(System.out::println);

使用Java 8和更高版本的流函数

答案 7 :(得分:-2)

尝试一下:

 System.out.println(Arrays.asList(stackobject.toArray()));
 System.out.println(Arrays.toString(stackobject.toArray()));