PDA

Visualizza la versione completa : [java] classe Vector


naighes
11-07-2002, 17:30
Mi hanno costretto ad utilizzare la classe Vector... ne farei volentieri a meno, preferisco la "rudimentalità" degli array.
Il fatto è che in fase di compilazione è tutto ok.

Quando però comincio ad inserire oggetti nel vettore ecco che cosa mi viene detto:

Exception in thread "main" Java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1
at Java.util.Vector.get(Vector.Java:713)

ecc ecc.

Qualcuno mi sa dire cosa succede?
Grazie infinite

niko80
11-07-2002, 17:46
Ciao, se postassi un pò di codice sarebbe meglio!!

niko80
11-07-2002, 17:51
comunque dal messaggio di errore probabilmente richiami un valore dal vettore ad una posizione inesistente o il vettore è vuoto o hai superato l'indice!!!

naighes
11-07-2002, 17:59
... è un lavorone da nulla!
E' abbastanza lunghetto.
Provo a trarre i passi salienti!

Il programma è una volgare Agenda di appuntamenti gestita da shell. (niente interazione con i database e roba varia...)

La mia agenda è, in pratica un vettore di appuntamenti.

Ecco come viene aggiunto un appuntamento nel vettore:

public static void aggiungiAppuntamento(Vector v, int gg, int mm, int oi, int of, String de)
{
// Controllo che i dati siano stati inseriti correttamente

if(Appuntamento.check(gg, mm, oi, of))
{

Appuntamento oggetto = new Appuntamento(gg, mm, oi, of, de);

// Caso base il vettore è vuoto
if(v.isEmpty())
{
v.add(oggetto);
}

else
{
//controllo che non ci sia un altro appuntamento coincidente

if (BinarySearch (v, oggetto.getDay(), oggetto.getMonth(), oggetto.getStart(),oggetto.getEnd()) != -1)
{
System.out.println("Appuntamenti coincidenti: Ripetere operazione");
}

// E' probabile che sia questa la parte incriminata....

v.add(oggetto);
mergeSort(v, 0, v.size() -1);
}
}
else
{
System.out.println("Valori errati! Ripetere inserimento");
}
}

La ricerca binaria mi evita che ci siano contrasti tra gli appuntamenti in agenda.
MergeSort mi ordina i vettori in agenda a seconda dell'ora, del giorno e del mese.
Ti fornisco entrambi gli algoritmi:

public static void merge(Vector v, int from, int mid, int to)
{
int n = to - from + 1;
// Dimensione dell'intervallo da findere

Vector b = new Vector(n);
int i1 = from;
int i2 = mid + 1;
int j = 0;
while(i1 <= mid && i2 <= to)
{
if(((Appuntamento) v.get(i1)).getMonth() < ((Appuntamento) v.get(i2)).getMonth())
{
b.set(j, ((Appuntamento) v.get(i1)));
i1++;
}

if(((Appuntamento) v.get(i1)).getMonth() == ((Appuntamento) v.get(i2)).getMonth())
{
if(((Appuntamento) v.get(i1)).getDay() < ((Appuntamento) v.get(i2)).getDay())
{
b.set(j, ((Appuntamento) v.get(i1)));
i1++;
}

if(((Appuntamento) v.get(i1)).getDay() == ((Appuntamento) v.get(i2)).getDay())
{
if(((Appuntamento) v.get(i1)).getStart() < ((Appuntamento) v.get(i2)).getStart())
{
b.set(j, ((Appuntamento) v.get(i1)));
i1++;
}

else
{
b.set(j, ((Appuntamento) v.get(i2)));
i2++;
}
}

if(((Appuntamento) v.get(i1)).getDay() > ((Appuntamento) v.get(i2)).getDay())
{
b.set(j, ((Appuntamento) v.get(i2)));
i2++;
}
}

if(((Appuntamento) v.get(i1)).getMonth() > ((Appuntamento) v.get(i2)).getMonth())
{
b.set(j, ((Appuntamento) v.get(i2)));
i2++;
}

j++;
}

while (i1 <= mid)
{
b.set(j, ((Appuntamento) v.get(i1)));
i1++;
j++;
}

while (i2 <= to)
{
b.set(j, ((Appuntamento) v.get(i2)));
i2++;
j++;
}

for(j = 0; j < n; j++)
v.set(from + j, ((Appuntamento) b.get(j)));
}

public static void mergeSort(Vector v, int from, int to)
{
if(from == to) return;
int mid = (from + to) / 2;
mergeSort(v, from, mid);
mergeSort(v, mid + 1, to);
merge(v, from, mid, to);
}
}

ed ecco la ricerca binaria:

/**
Verifica che non ci siano contrasti tra gli appuntamenti
@param v il vettore da esaminare
*/

public static int BinarySearch(Vector v, int gg, int mm, int oi, int of)
{
return Ricerca(v, 0, v.size() -1, gg, mm, oi, of);
}

/**
Ricerca un appuntamento all'interno del vettore
@param v il vettore da esaminare
return l'indice del vettore corrispondente all'appuntamento
*/

public static int Ricerca(Vector v, int from, int to, int gg, int mm, int oi, int of)
{
if (from == to || oi >= of)
{
return -1;
}
int mid = (from + to) / 2;
int index = mid;
int diffmm = ((Appuntamento) v.get(mid)).getMonth() - mm;

if (diffmm < 0)
{
return Ricerca(v, mid +1, to, gg, mm, oi, of);
}

if (diffmm > 0)
{
return Ricerca(v, from, mid -1, gg, mm, oi, of);
}

if (diffmm == 0)
{
int diffgg = ((Appuntamento) v.get(mid)).getDay() - gg;
if (diffgg < 0)
{
return Ricerca(v, mid +1, to, gg, mm, oi, of);
}

if (diffgg > 0)
{
return Ricerca(v, from, mid -1, gg, mm, oi, of);
}

if (diffgg == 0)
{
int diffoi = ((Appuntamento) v.get(mid)).getStart() - oi;
if (diffoi > 0)
{
return Ricerca(v, from, mid -1, gg, mm, oi, of);
}

if (diffoi < 0)
{
return Ricerca(v, mid +1, to, gg, mm, oi, of);
}

if (diffoi == 0)
{
index = mid;
}
}
}

return index;
}

Credo comunque che se ti mandassi il file ci capiresti di più!
Comunque grazie! :)

niko80
11-07-2002, 18:11
infatti così non riesco a controllarlo molto :confused: , la mia mail è questa r.nicolazzo@eusysgrou.it

niko80
11-07-2002, 18:12
oppsss il dominio è eusysgroup!!

naighes
12-07-2002, 01:44
Ti ho inviato il tutto via email.

Ti ringrazio infinitamente per la tua disponibilità!

niko80
12-07-2002, 10:54
l'errore quando si ferifica? cosa devo fare per riprodurre l'errore?
ho provato a fare un inserimento e sembra andar bene!!

naighes
12-07-2002, 17:33
Prova ad effettuare più inserimenti (ne bastano 2) e vedrai che ti darà il messaggio di errore.

Lancill
12-07-2002, 18:58
che mi mandi il file anche a me? l'email è lancill@email.it
4 occhi sono meglio di 2 :)

:ciauz:

Loading