Advertisement
gabuwu

TP03 - EJ5 - Clase Queue

Nov 7th, 2021
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.85 KB | None | 0 0
  1.  
  2. import java.lang.reflect.Array;
  3. import java.util.Iterator;
  4.  
  5.     public class Queue<ELEMENT> implements Iterable<ELEMENT> {
  6.          
  7.         //region Constants
  8.      
  9.         protected final static Integer defaulDimension = 10;
  10.      
  11.         //endregion
  12.      
  13.         //region Attributes
  14.      
  15.         protected Class<?> elementClass;
  16.         protected ELEMENT [] data;
  17.         protected int head;
  18.         protected int tail;
  19.         protected int count;
  20.      
  21.         //endregion
  22.      
  23.         //region Constructors
  24.      
  25.         public Queue() {
  26.             this(Queue.defaulDimension);
  27.         }
  28.      
  29.         // from https://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java
  30.         @SuppressWarnings("unchecked")
  31.         public Queue(int dimension, ELEMENT... dummy) {
  32.             if (dummy.length > 0) {
  33.                 throw new IllegalArgumentException("No se debe facilitar valores para dummy");
  34.             }
  35.             elementClass = dummy.getClass().getComponentType();
  36.             this.data = (ELEMENT []) Array.newInstance(this.elementClass, dimension);
  37.             this.head = 0;
  38.             this.tail = 0;
  39.             this.count = 0;
  40.         }
  41.         //endregion
  42.      
  43.         //region Queue Internal Methods
  44.         protected int next(int pos) {
  45.             if (++pos >= this.data.length) {
  46.                 pos = 0;
  47.             }
  48.             return pos;
  49.         }
  50.         //endregion
  51.      
  52.      
  53.         //region Queue Methods
  54.      
  55.         // Operacion EnQueue en la teoría de Estructura de Datos
  56.         //
  57.         // Inserts the specified element into this queue if it is possible to do so
  58.         // immediately without violating capacity restrictions, returning true upon
  59.         // success and throwing an IllegalStateException if no space is currently
  60.         // available.
  61.         public boolean add(ELEMENT vector) {
  62.      
  63.             if (this.size() >= this.data.length) {
  64.                 throw new IllegalStateException("Cola llena ...");
  65.             }
  66.      
  67.             this.data[this.tail] = vector;
  68.             this.tail = this.next(this.tail);
  69.             ++this.count;
  70.      
  71.             return true;
  72.         }
  73.      
  74.         // Operacion peek en la teoría de Estructura de Datos
  75.         //
  76.         // Retrieves, but does not remove, the head of this queue. This method differs
  77.         // from peek only in that it throws an exception if this queue is empty.
  78.         public ELEMENT vector() {
  79.      
  80.             if (this.size() <= 0) {
  81.                 throw new IllegalStateException("Cola vacía ...");
  82.             }
  83.      
  84.             return this.data[this.head];
  85.         }
  86.      
  87.      
  88.      
  89.      
  90.         //region Override Object basic methods
  91.      
  92.         @Override
  93.         public String toString() {
  94.      
  95.             if (this.size() <=0) {
  96.                 return "";
  97.             }
  98.      
  99.             // from https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/lang/StringBuilder.html
  100.             StringBuilder sb = new StringBuilder();
  101.             sb.append("[" + this.data[this.head].toString());
  102.      
  103.             for (int cta = 1, pos = this.next(this.head); cta < this.size(); ++cta, pos = this.next(pos)) {
  104.                 sb.append(", " + this.data[pos].toString());
  105.             }
  106.      
  107.             sb.append("]");
  108.             return sb.toString();
  109.         }
  110.         //endregion
  111.      
  112.      
  113.         //region Collection Methods
  114.      
  115.        
  116.      
  117.         public int size() {
  118.             return this.count;
  119.         }
  120.      
  121.         public ELEMENT[] toArray() {
  122.             if (this.size() <= 0) {
  123.                 throw new IllegalStateException("Cola vacía ...");
  124.             }
  125.      
  126. //          ELEMENT [] result = (ELEMENT []) new Object[this.size()];
  127.             ELEMENT [] result = (ELEMENT []) Array.newInstance(this.elementClass, this.size());
  128.             for(int i = 0, pos = this.head, cta = this.size(); cta > 0; ++i, pos = this.next(pos), --cta) {
  129.                 result[i] = this.data[pos];
  130.             }
  131.             return result;
  132.         }
  133.         //endregion
  134.    
  135.      
  136.         //region Iterable Methods
  137.      
  138.         @Override
  139.         public Iterator<ELEMENT> iterator() {
  140.             return new QueueIterator(this);
  141.         }
  142.      
  143.         private class QueueIterator implements Iterator<ELEMENT> {
  144.      
  145.             //region Attributes
  146.      
  147.             private Queue<ELEMENT> itQueue;
  148.             private int itCount;
  149.             private int itPos;
  150.      
  151.             //endregion
  152.      
  153.             //region Constructor
  154.      
  155.             public QueueIterator(Queue<ELEMENT> queue) {
  156.                 this.itQueue = queue;
  157.                 this.itCount = this.itQueue.size();
  158.                 this.itPos = this.itQueue.head;
  159.             }
  160.      
  161.             //endregion
  162.      
  163.             @Override
  164.             public boolean hasNext() {
  165.                 return this.itCount > 0;
  166.             }
  167.      
  168.             @Override
  169.             public ELEMENT next() {
  170.                 if ( !this.hasNext() ) {
  171.                     throw new RuntimeException("Error en el iterador de la cola...");
  172.                 }
  173.                 ELEMENT item = this.itQueue.data[this.itPos];
  174.                 this.itPos = this.itQueue.next(this.itPos);
  175.                 --this.itCount;
  176.                 return item;
  177.             }
  178.         }
  179.    
  180.    
  181.  
  182. }
  183.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement