Newsgroup: it.comp.java
Titolo: aggiungere elemento in ordine alfabetico in array dinamico

Ciao a tutti, premetto che sono alle prime armi con Java. Sto creando una 
rubrica: istanzio un oggetto (da una classe separata dal mio programma) e lo 
devo inserire in un vettore dinamico. Voglio però che ogni volta in cui 
inserisco un nuovo oggetto venga fatto un confronto con quelli già presenti 
(se ce ne sono ovviamente) nel vettore, per capire dove inserire quello 
nuovo in base all'ordine alfabetico rispetto al nome. Il problema è che una 
volta effettuato il confronto, uso il metodo insertElementAt per inserire 
l'oggetto nuovo prima o dopo quello con cui effettuo il confronto, e il 
compilatore mi restituisce un errore:
insertElementAt(unkwon source). Potete spiegarmi perchè? Grazie in anticipo, 
ecco il codice:
static void aggiungiNome(Vector addressbook)
   {
     Anagrafica contatto=new Anagrafica();
     contatto.inserisciValori();
     int numeroElementi=addressbook.size(); //System.out.println("\n\nnumero 
elementi vettore: "+posizione);
      //prima di inserire oggetto nel vettore faccio ricerca per capire dove 
inserire elemento in base a ordine alfabetico (uso metodo compare)
     int precedenzaStringa=0;
     int f=0; addressbook.addElement(contatto);
    /* if(numeroElementi!=0)
     {
      for(int i=0;i<numeroElementi;i+=1)
      {
       precedenzaStringa=contatto.posizionareOggettoNuovo(addressbook,f);
      //System.out.println("\n\nrisultato funzione precedenza: 
"+precedenzaStringa);
       if(precedenzaStringa==0) addressbook.insertElementAt(contatto,i);
       else if(precedenzaStringa>0) 
addressbook.insertElementAt(contatto,(i+1));
       else if(precedenzaStringa<0) 
addressbook.insertElementAt(contatto,(i-1));
       f+=1;
      }
     }
     else addressbook.addElement(contatto);*/
QUESTO E' IL METODO NELLA CLASSE SEPARATA
public int posizionareOggettoNuovo(Vector addressbook,int i)
    {
     Anagrafica appoggioOggettoVettore=new Anagrafica();
     String nomeOggettoVettore=new String();
     String nomeOggettoNuovo=new String();
     int ris=0;
     appoggioOggettoVettore=(Anagrafica)addressbook.elementAt(i);
     nomeOggettoNuovo=nome;
     nomeOggettoVettore=appoggioOggettoVettore.nome;
     ris=nomeOggettoNuovo.compareTo(nomeOggettoVettore);
     return ris;
    } 

dragonet (28/03/2009):

Fammi capire: addressbook quindi è un Vector contenente anagrafiche che
devono sempre essere ordinate alfabeticamente.
Dato che sei alle prime armi, ti do volentieri un po' di materiale su
cui lavorare.
Java fornisce davvero molta "pappa pronta", soprattutto dal punto di
vista dei "container". Se provi a guardare qui:
http://java.sun.com/javase/6/docs/api/java/util/TreeSet.html
...farai la conoscenza di java.util.TreeSet , container specializzato
in:
1) mantenere un insieme distinto di oggetti: non può contenere due
elementi uguali (leggi la documentazione di java.util.Set , interfaccia
implementata da TreeSet)
2) mantenere l'insieme ordinato secondi criteri da te decisi (e lo fa
con la massima efficienza possibile)
Come fare a stabilire il criterio di ordinamento? Fin che si tratta di
ordinare oggetti String, TreeSet ha già tutto quello che serve. Dato
che devi ordinare oggetti di classe "Anagrafica", dovrai dare una
piccola mano a TreeSet, creando uno strumento che permetta a TreeSet di
confrontare due "Anagrafica", e stabilire qual'è la minore, la
maggiore, oppure se sono equivalenti.
Questo lo fai implementando l'interfaccia java.util.Comparator:
public class ConfrontoAnagrafica implements Comparator<Anagrafica> {
  public int compare(Anagrafica o1, Anagrafica o2) {
    //Questo codice lo devi scrivere te, l'importante è che
    //ritorni -1 se o1<o2, 0 se equivalenti, 1 se o1>o2
  }
  public boolean equals(Object obj) {
    //Questo metodo è implementato per questioni di performance
    return (obj instanceof ConfrontoAnagrafica);
  }
}
Creato il tuo algoritmo di confronto, puoi preparare un TreeSet che può
contenere le tue anagrafiche, e che mantiene l'ordine da te descritto
ad ogni inserimento:
...
TreeSet<Anagrafica> addressbook =
   new TreeSet<Anagrafica>(new ConfrontoAnagrafica());
...
...
Anagrafica contatto=new Anagrafica();
//compili il tuo contatto con i dati anagrafici
addressbook.add(contatto);
...
Se poi vuoi scorrere i nominativi presenti in addressbook:
...
for(Anagrafica contatto:addressbook) {
  //Ad ogni ripetizione del ciclo verrà assegnato a "contatto"
  //il riferimento al prossimo contatto contenuto nella lista
}
Spero possa esserti utile, ma soprattutto spero ti abbia invogliato a
consultare un po' di più la documentazione.
Ciao
-- 
Scientology: se la conosci la eviti, se la conosci non ti uccide...
http://xenu.com-it.net
 - 
http://xenu.freewinds.cx
 - 
http://www.xenu.net
(per rispondere personalmente leva IlDitoDalCulo)
---> 09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0 <---

 
postresti postare il messaggio esatto del compilatore,per favore?

 errore:
Invece di quel guazzabuglio, puoi semplicemente seguire quanto espresso qua:
http://www.exampledepot.com/egs/java.util/coll_InsertInList.html
.
Inoltre, che motivo hai di usare un Vector? Solitamente è meglio usare
ArrayList o LinkedList, che sono più performanti (o meglio il Vector è inutilmente
pesante se non hai necessità di condividere la lista tra più thread).


wrote:

Ha ragione OcchioDiDrago. Se vuoi una lista che rimanga ordinata man
mano che inserisci elementi
DEVI usare un TreeSet ( e quindi capire cosa sono le interfacce
Comparable e Comparator) , altrimenti ti fai del male.
Ti consiglio gia' che ci sei di studiarti i capitoli di qualche buon
libro Java sulle Collection. Anche il tuo uso di Vector
e' un errore , dovresti usare ArrayList.
Capisco la tua voglia di buttarti sulla "creativita', ma se non leggi
prima almeno un buon libro di Java fai necessariamente solo
porcherie :P