当前位置: 首页 > 知识库问答 >
问题:

在堆栈的ArrayList中,如果堆栈为空,为什么索引不正确?

尉迟远
2023-03-14


我有一个堆栈的ArrayList,我在其中一个堆栈中添加了一个元素,并在列表中循环打印每个堆栈的索引

然后我从上一个堆栈中删除元素,将其添加到下一个堆栈中,打印每个堆栈的索引,并对ArrayList中的所有堆栈继续此操作

然而,当任何堆栈为空时,在获取ArrayList中每个堆栈的索引时会出现非常不寻常的行为。非空的堆栈将具有正确的索引值,而空的堆栈将具有错误的索引值

此外,如果包含元素的堆栈的索引为0,则所有其他索引值都将为1。如果包含元素的堆栈位于任何其他索引,它将具有正确的索引值,并且所有其他索引值都将为0

import java.util.List;
import java.util.Stack;
import java.util.ArrayList;

public class ListOfStacks {

    // instance variables:
    List<Stack<Integer>> stacks;
    private static final int NUMBER_OF_STACKS = 3;

    // constructor:
    ListOfStacks() {
        this.stacks = new ArrayList<Stack<Integer>>(NUMBER_OF_STACKS);

        // adding the stacks to the list here:
        for (int i = 0; i < NUMBER_OF_STACKS; i++) {
            this.stacks.add(new Stack<Integer>());
        }
    }

    // instance methods:
    void addElement(int stackIndex, int element) {
        this.stacks.get(stackIndex).add(element);
    }
    void removeElement(int stackIndex) {
        this.stacks.get(stackIndex).pop();
    }
    void printIndexes(int stackIndex, int element) {
        System.out.printf("The stack at index %d now contains %d" +
            "(the other stacks are empty):%n", stackIndex, element);

        for (Stack<Integer> stack : this.stacks) {
            System.out.printf("index %d%n", this.stacks.indexOf(stack));
        }
        System.out.println();
    }

    // main method:
    public static void main(String[] args) {
        ListOfStacks list = new ListOfStacks();
        int index = 0, number = 5;

        // adding the number 5 to the stack at index 0:
        list.addElement(index, number);
        list.printIndexes(index, number);

        // now removing that element, and adding it to the stack at index 1:
        list.removeElement(index++);
        list.addElement(index, number);
        list.printIndexes(index, number);

        // now removing that element, and adding it to the stack at index 2:
        list.removeElement(index++);
        list.addElement(index, number);
        list.printIndexes(index, number);
    }
} // end of ListOfStacks

下面是输出(对于三个堆栈的ArrayList):

The stack at index 0 now contains 5 (the other stacks are empty):
index 0
index 1
index 1

The stack at index 1 now contains 5 (the other stacks are empty):
index 0
index 1
index 0

The stack at index 2 now contains 5 (the other stacks are empty):
index 0
index 0
index 2


共有2个答案

裴畅
2023-03-14
indexOf(Object o) 
          Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.

java中的堆栈基本上是一个向量,vector类将其用于equals

 /**
  969        * Compares the specified Object with this Vector for equality.  Returns
  970        * true if and only if the specified Object is also a List, both Lists
  971        * have the same size, and all corresponding pairs of elements in the two
  972        * Lists are <em>equal</em>.  (Two elements {@code e1} and
  973        * {@code e2} are <em>equal</em> if {@code (e1==null ? e2==null :
  974        * e1.equals(e2))}.)  In other words, two Lists are defined to be
  975        * equal if they contain the same elements in the same order.
  976        *
  977        * @param o the Object to be compared for equality with this Vector
  978        * @return true if the specified Object is equal to this Vector
  979        */
  980       public synchronized boolean equals(Object o) {
  981           return super.equals(o);
  982       }

因此,indexof正在寻找第一个空堆栈,将其视为相等,并返回该索引。

因此,当索引0有元素而其他没有元素时,第一个等于空堆栈的堆栈是位置1。

如果另一个元素有数据,并且第一个元素相等,并且您正在寻找一个空堆栈,它将始终停止并返回索引0。

丁立果
2023-03-14

获取错误索引号的原因与列表中实现indexOf的方式有关。它在下面调用堆栈。equals()。这决定了堆栈在元素方面是否相等。当你调用列表时。indexOf对于空堆栈,它将返回列表中第一个空堆栈的索引

 类似资料:
  • 我试图通过将ajax请求中的for循环的值发送到php文件来检查数据库中的值,“each value in request”,然后文件返回变量“avl”,如果不是,则不可用。 问题是,我检查了一个值流,它们都必须返回才能继续我的过程,但条件不会等到for循环结束才进行检查。它在for循环启动之前检查条件,即使代码也不是那样的。例如:在for循环在第50行结束之前,它在第100行执行条件。 它总是通

  • 问题内容: 我的用例需要一个数据结构。我应该能够将项目推送到数据结构中,而我只想从堆栈中检索最后一个项目。该堆栈的JavaDoc说: Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。例如: 我绝对不希望这里出现同步行为,因为我将使用方法本地的数据结构。除了这个,我为什么还要在这里呢? PS:Deque的Javadoc说: 双端队列也可以用作LIFO(后进先出)堆栈。

  • 问题内容: 内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么,进程如何在这两个堆栈之间进行协调? 问题答案: 内核堆栈和用户堆栈有什么区别? 简而言之,除了在内存中使用不同的位置(并因此为堆栈指针寄存器使用不同的值)之外,什么也没有,而且通常使用不同的内存访问保护。也就是说,在用户模式下执行时,即使映射了内核内存(

  • 我来自C/C++背景,在这里一个进程内存分为: null 我想把我的注意力集中在这一点上,当我阅读JVM中的堆和堆栈时,我们是在谈论堆栈和堆的概念吗?并且整个JVM的实际内存驻留在堆上(这里指的是堆的C++概念)?

  • 本文向大家介绍在C ++中正确使用堆栈和堆?,包括了在C ++中正确使用堆栈和堆?的使用技巧和注意事项,需要的朋友参考一下 堆栈-函数内部声明的所有变量将占用堆栈中的内存。因此,函数内的任何局部变量都位于堆栈中。 堆-这是程序的未使用内存,可用于在程序运行时动态分配内存。因此,如果我们希望某些东西的寿命比声明它的函数的寿命更长,则必须在堆上分配它。 示例 堆内存中的主要问题是碎片,而堆栈中更容易出

  • 问题内容: 我是Hadoop / ZooKeeper的新手。我不明白将ZooKeeper与Hadoop结合使用的目的,ZooKeeper是否在Hadoop中写入数据?如果不是,那么为什么我们将ZooKeeper与Hadoop一起使用? 问题答案: Hadoop 1.x不使用Zookeeper。即使在Hadoop 1.x安装中,HBase也会使用zookeeper。 Hadoop从2.0版开始也采用