PDA

View Full Version : [Java] FIFO artigianale


AngeL)
20-06-2007, 08:38
volevo creare una classe che emulasse uno stack, per capire come funzionano gli array, ma non ci sono riuscito :D
quando compilo ci sono molti errori, molti riferiti al metodo length():
questo è il codice:

public class FIFO {
int[] a;

public void add(int elem) {
int[] temp = a;
a = new int[a.length() + 1];
for (int i = 0; i < temp.length(); i++) {
a[i+1] = temp[i];
}
a[0] = elem;
}

public int pop() {
int[] temp = a;
a = new int[a.length() - 1];
for (int i = 0; i < temp.length() - 1; i++) {
a[i] = temp[i];
}
return temp[temp.length() - 1];
}
}

e questi sono gli errori:

C:\Users\AngeL\Desktop\FIFO.java:6: cannot find symbol
symbol : method length()
location: class int[]
a = new int[a.length() + 1];
^
C:\Users\AngeL\Desktop\FIFO.java:6: operator + cannot be applied to Array.length,int
a = new int[a.length() + 1];
^
C:\Users\AngeL\Desktop\FIFO.java:6: incompatible types
found : <nulltype>
required: int
a = new int[a.length() + 1];
^
C:\Users\AngeL\Desktop\FIFO.java:7: cannot find symbol
symbol : method length()
location: class int[]
for (int i = 0; i < temp.length(); i++) {
^
C:\Users\AngeL\Desktop\FIFO.java:15: cannot find symbol
symbol : method length()
location: class int[]
a = new int[a.length() - 1];
^
C:\Users\AngeL\Desktop\FIFO.java:16: cannot find symbol
symbol : method length()
location: class int[]
for (int i = 0; i < temp.length() - 1; i++) {
^
C:\Users\AngeL\Desktop\FIFO.java:19: cannot find symbol
symbol : method length()
location: class int[]
return temp[temp.length() - 1];
^
7 errors

Tool completed with exit code 1

che ho sbagliato? :confused:

^TiGeRShArK^
20-06-2007, 09:00
temp.length

NON temp.length()

e lo stesso in tutti gli altri punti :p

Ma usare un IDE decente con il syntax highlighting, no eh? :confused:

andbin
20-06-2007, 09:35
volevo creare una classe che emulasse uno stack, per capire come funzionano gli array, ma non ci sono riuscito :DInnanzitutto stack non vuol dire un comportamento FIFO ma semmai LIFO.
Poi comunque la tua tecnica di ridimensionare l'array e spostare fisicamente tutti gli elementi dell'array non è il massimo della efficienza ....
In genere volendo usare un array, se si realizza un LIFO (stack) si gestisce la dimensione in modo "logico", non fisico. E nel caso di FIFO (coda) si usa array gestito in modo "circolare".

AngeL)
20-06-2007, 10:25
Ma usare un IDE decente con il syntax highlighting, no eh? :confused: quale mi consigli? io adesso uso textpad... prima avevo notepad++ ma non funziona piu'... magari provo a reinstallarlo

Innanzitutto stack non vuol dire un comportamento FIFO ma semmai LIFO.uh.. volevo dire coda :ops: nel caso di FIFO (coda) si usa array gestito in modo "circolare". in che modo?

andbin
20-06-2007, 11:09
uh.. volevo dire coda
in che modo?Questa è una classe che avevo fatto un po' di tempo fa:
class FixedQueue<E>
{
private Object[] elements;
private int front;
private int count;

public FixedQueue (int size)
{
if (size < 1)
throw new IllegalArgumentException ("size cannot be lower than 1");

elements = new Object[size];

front = 0;
count = 0;
}

public synchronized void insert (E item)
throws InterruptedException
{
while (count == elements.length)
wait ();

elements[(front+count) % elements.length] = item;
count++;

notifyAll ();
}

public synchronized E extract ()
throws InterruptedException
{
while (count == 0)
wait ();

@SuppressWarnings("unchecked")
E item = (E) elements[front];

front = (front + 1) % elements.length;
count--;

notifyAll ();
return item;
}
}Nota che è: 1) generica 2) sincronizzata per uso multithread (che è il caso tipico di uso per una coda) 3) bloccante se l'inserimento trova la coda piena o se la estrazione trova la coda vuota.

Ma a parte queste cose, il concetto che usa è appunto un array "circolare".
front
|
|
XXX------XXXXX
---->
-->
count'front' indica il "fronte" della coda (da cui si estrae) e 'count' indica la dimensione "logica" della coda.

AngeL)
20-06-2007, 11:32
Questa è una classe che avevo fatto un po' di tempo fa:grazie :) ora me la studio un po' :D