2011-08-25 36 views
0

我已經使用java堆棧數據結構來維護數據。我限制我的堆棧大小爲50.我想要做的是從一次調用中獲取堆棧中的最新5個數據。我認爲方法子列表(0,5)會做到這一點。但不幸的是,方法返回最後5個數據,因爲從java.util.list繼承的方法有什麼辦法做到這一點。還是有任何其他數據結構可以滿足我的要求。請幫助我。提前致謝。從堆棧中獲取前5個數據

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}

+0

不知道我是否理解這個問題..你想要堆棧中的最後5個項目,並且該方法確實返回最後5個數據..你究竟在問什麼? –

+0

你說你想要「最新的5個數據」,並且該方法返回「最後5個數據」。似乎你得到你想要的東西。 –

回答

2

如果sublist(0,5)返回棧的錯誤末端,請嘗試更改索引。而不是從0開始,從stack.size()-6開始。

正如別人指出,你也可以pop() 5倍。在功能語言中,您正在查找的操作簡稱爲take 5。自己實現它很容易,但是你必須用Java來派生自己的堆棧類。

另一個重要的一點:當你5次使用pop()時,那些元素將被從堆棧中移除。這可能是也可能不是你想要的。但是,請記住,sublist會返回一個可能會修改堆棧本身的列表,因此您可以輕鬆地在那裏遇到完整性問題。

因此,我建議你寫你自己的堆棧類,並實現一個take(n)方法執行sublist呼叫,並將結果複製到一個新的列表,使得最終返回的列表可以在不影響原來的堆棧。

3

默認堆棧實現不具有您需要的方法。 你將不得不彈出()你的堆棧5次。

所以我建議擴展一個Stack實現或者編寫一個實用的方法來組合5個pops。

類似:

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; 
    } 

但需要考慮每個彈出

的行爲,如果你需要一個multipeek

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; 
    } 
+0

其實我不想從堆棧中刪除元素。如果我彈出最新的5個數據將從堆棧中刪除 – nath

0

一般來說,如果你有一個實際的堆棧,你將有一個方法彈出。一個堆棧不完全是一個簡單的列表。你可以彈出5次,但你需要確保有什麼東西可以取出堆棧。