2017-01-23 66 views
-3

問題:我試圖重寫ArrayList的add方法來記住添加到數組列表的最後三位數字。然後,我要拿這三個值,並找出它們中的最大值。覆蓋ArrayList的add方法<Integer>

看來,我不能得到我的add方法來保存三個元素沒有出界的錯誤。

import java.util.ArrayList; 

public class MaxThreeArrayList extends ArrayList<Integer> { 

    MaxThreeArrayList maxlist = new MaxThreeArrayList(); 

    int third_last = 0; 
    int second_last = 0; 
    int last = 0; 

     @Override public boolean add(Integer o){ 
      if (maxlist.size() == 1){ 
       last = maxlist.get(maxlist.size() - 1); 
      } 
      else if (maxlist.size() == 2){ 
       last = maxlist.get(maxlist.size() - 1); 
       second_last = maxlist.get(maxlist.size() - 2); 

      } 
      else if (maxlist.size() >= 3){ 
       last = maxlist.get(maxlist.size() - 1); 
       second_last = maxlist.get(maxlist.size() - 2); 
       third_last = maxlist.get(maxlist.size() - 3); 
      } 

      return super.add(o); 
     } 

     public int getMax(){ 
      int maximum = 0; 
      if (third_last >= second_last){ 
       if (third_last >= last){ 
        maximum = third_last; 
       } 
      } 
      if (second_last >= third_last){ 
       if (second_last >= last){ 
        maximum = second_last; 
       } 
      } 
      if (last >= second_last){ 
       if (last >= third_last){ 
        maximum = last; 
       } 
      } 
      return maximum; 
     } 

    public static void main(String[] args) { 

    } 

} 
+0

你可以很容易地做到這一點與一個額外的圓形陣列或甚至堆棧;你可能過度複雜了。 – ChiefTwoPencils

+1

您也可以通過'Collections.max(subList(size() - 3,size()))' – 4castle

+1

獲得最大值您不需要添加任何內容到'maxlist' – VHS

回答

0

我想你應該分開你的顧慮。您被覆蓋的add應該只是擔心記住添加到列表中的最後三件事情。使用deque可以很容易地完成。顧名思義,方法getMax應該找出哪一個最大。

public class MaxThreeArrayList extends ArrayList<Integer> { 
    private final Deque<Integer> deque = new LinkedList<>(); 

    @Override public boolean add(Integer i) { 
     deque.addFirst(i); 
     if (deque.size() > 3) { deque.removeLast(); } 
     return super.add(i); 
    } 

    public Integer getMax() { 
     Integer max = 0; 
     for (Integer i : deque) { 
      if (i > max) { max = i; } 
     } 
     return max; 
    } 
} 

作爲一個額外的練習,您可能會注意到這個代碼可以更一般化。不需要使用硬編碼來記住最後3位。您可以使該數字可配置。