2017-01-23 1 views
-3

Frage: Ich versuche, die Add-Methode von Arraylist zu überschreiben, die letzten drei Ziffern hinzugefügt, um die Arraylist zu erinnern. Ich soll dann diese drei Werte nehmen und den maximalen Wert unter ihnen finden.Aufschalten die Add-Methode für Arraylist <Integer>

Es scheint, dass ich nicht meine Methode add die drei Elemente ohne außerhalb der Grenzen Fehler speichern bekommen kann.

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

Sie können dies mit einem zusätzlichen kreisförmigen Array oder sogar einem Stapel tun; Vermutlich überkomplizierst du es. – ChiefTwoPencils

+1

Sie können auch das Maximum mit 'Collections.max (subList (size() - 3, size()) bekommen' ' – 4castle

+1

Sie fügen nichts zur maxlist hinzu – VHS

Antwort

0

Ich denke, Sie sollten Ihre Bedenken trennen. Ihr übergeordneter add sollte sich nur darum kümmern, sich an die letzten drei Dinge zu erinnern, die Sie der Liste hinzufügen. Dies kann ziemlich einfach mit einer Deque erreicht werden. Die Methode getMax sollte herausfinden, welche die größte ist, wie der Name schon sagt.

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

Als zusätzliche Übung können Sie beachten, dass dieser Code allgemeiner gefasst werden kann. Es muss nicht fest codiert sein, um sich an die letzten 3 zu erinnern. Sie könnten diese Nummer konfigurierbar machen.

Verwandte Themen