【问题标题】:Get top 5 data from stack从堆栈中获取前 5 个数据
【发布时间】:2011-08-25 05:32:50
【问题描述】:

我使用 java stack 数据结构来维护数据。我将堆栈的大小限制为 50。我想要做的是从一次调用中获取堆栈中的最新 5 个数据。我认为方法 sublist(0,5) 会做到这一点。但不幸的是,该方法返回最后 5 个数据,因为该方法继承自 java.util.list 有没有办法做到这一点。或者是否有任何其他数据结构可以满足我的要求。请帮助我。提前致谢。

P.s 我想在我检索后在堆栈中保留最新的 5 个数据。

 Stack stack = new Stack();
        for(int i=0; i<10;i++){
            stack.push(""+i);
        }
        for(int k= 0 ;k<11;k++){
            System.out.println(stack.subList(0,5));
        }

输出将是 {0,1,2,3,4}。但我想得到 {9,8,7,6,5}

【问题讨论】:

  • 不确定我是否理解这个问题..您想要堆栈中的最后 5 个项目,并且该方法确实返回最后 5 个数据..您到底要问什么?
  • 您说您想要“最新的 5 个数据”,并且该方法返回“最后 5 个数据”。似乎你得到了你想要的。

标签: java data-structures stack


【解决方案1】:

默认堆栈实现没有您需要的方法。 你将不得不 pop() 你的堆栈 5 次。

所以我建议扩展一个 Stack 实现或编写一个实用方法来分组 5 个 pop。

类似:

public static <T> List<T> multiPop( Stack<T> stack, int times)
  {
    List<T> list = new ArrayList<T>();
    for ( int i = 0;i<times;i++)
      {
      list.add(stack.pop());
      }
    return list;
  }

但需要考虑每个流行音乐的行为

如果你需要多看

 public static <T> List<T> multiPeek( Stack<T> stack, int depth )
  {
    int len = stack.size();
    if ( len < depth )
      throw new EmptyStackException();
    List<T> list = new ArrayList<T>();
    for (int i = 0; i < depth; i++)
      {
      list.add(stack.elementAt(len-i-1));
      }
    return list;
  }

【讨论】:

  • 其实我不想从堆栈中删除元素。如果我弹出最新的 5 个数据将从堆栈中删除
【解决方案2】:

如果sublist(0,5) 返回堆栈的错误端,请尝试更改索引。不要从0开始,而是从stack.size()-6开始。

正如其他人指出的那样,您也可以pop() 5 次。在函数式语言中,您要查找的操作简称为take 5。自己实现很容易,但您必须在 Java 中派生自己的堆栈类。

另一个重要的一点:当你pop() 5 次时,那些元素将从堆栈中移除。这可能是也可能不是您想要的。但是,请记住,sublist 将返回一个可能会修改堆栈本身的列表,因此您很容易在那里遇到完整性问题。

因此,我建议您编写自己的堆栈类并实现 take(n) 方法,该方法执行 sublist 调用并将结果复制到新列表中,这样最终返回的列表不会影响您的原始堆栈。

【讨论】:

    【解决方案3】:

    通常如果你有一个实际的堆栈,你会有一个方法 pop。堆栈并不是一个直接的列表。您可以弹出 5 次,但您需要确保有东西可以从堆栈中取出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-03
      • 2014-04-26
      • 2012-12-27
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多