2017-01-23 49 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位。您可以使该数字可配置。