2017-01-23 4 views
-3

質問:ArrayListのaddメソッドをオーバーライドして、arraylistに最後の3桁を追加しています。私はこれら3つの値をとり、それらの中で最大値を見つけます。ArrayListのaddメソッドをオーバーライドします。<Integer>

私は、範囲外のエラーなしで3つの要素を保存する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は、リストに追加した最後の3つのものを覚えておくことを心配してください。これは、両端キューを使って簡単に行うことができます。メソッド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つを覚えておくためにハードコードする必要はありません。その番号を構成可能にすることができます。

関連する問題