n° 185
Maggio/Giugno 2013
Maggio 21, 2013, 03:13:51 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: funzioni pop() e push() per ArrayList  (Letto 782 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
dennis87
Newbie
*

Karma: +0/-1
Scollegato Scollegato

Messaggi: 25


Mostra profilo E-mail
« inserita:: Giugno 14, 2012, 05:54:59 pm »

Ciao a tutti,
dovrei scrivere una funzione che effettua una visita in profondità.
Sto prendendo spunto dal codice di un esercizio dove viene fatta così:
Codice:
LinkedList<T> visitaDFS(){
LinkedList<T> lista=new LinkedList<T>();
LinkedList<NodoVP<T>> pila=new LinkedList<NodoVP<T>>();

//inizializzo la pila
pila.push(radice());
while(pila.size()!=0){
//estraggo
NodoVP<T> temp=pila.pop();
//visito
lista.addLast(temp.getInfo());
//inserisco i figli di chi ho visitato.
//Essi sono da ricercare!!
for(int i=0;i<numNodi();i++)
if(padri[i]==temp)
pila.push(nodi[i]);
}
System.out.println("Visita in profondita': ");
stampa_visita(lista);
return lista;
}
usando le funzioni pop() e push() che sono funzioni della LinkedList.
Io sto usando un ArrayList e le funzioni pop() e push() non sono specificate.
Come posso fare per specificarle?
Questo è il mio codice
Codice:
ArrayList<T> visitaDFS(){
//    ArrayList<T> lista=new ArrayList<T>();
//    ArrayList<NodoLF<T>> pila=new ArrayList<NodoLF<T>>();
//   
//    //inizializzo la pila
//    pila.push(getRadice());
//    while(pila.size()!=0){
//    //estraggo
//    NodoLF<T> temp=pila.pop();
//    //visito
//    lista.add(temp.getInfo());
//    //inserisco i figli di chi ho visitato.
//    //Essi sono da ricercare!!
//    for(int i=0;i<numNodi();i++)
//    if(padri[i]==temp)
//    pila.push(nodi[i]);
//    }
//    System.out.println("Visita in profondita': ");
//    stampa_visita(lista);
//    return lista;
//    }
Registrato
dennis87
Newbie
*

Karma: +0/-1
Scollegato Scollegato

Messaggi: 25


Mostra profilo E-mail
« Risposta #1 inserita:: Giugno 14, 2012, 08:50:31 pm »

possibile che nessuno mi sa aiutare?
Registrato
mega_saiyan
Sr. Member
****

Karma: +16/-14
Scollegato Scollegato

Messaggi: 984


Mostra profilo
« Risposta #2 inserita:: Giugno 15, 2012, 09:59:11 am »

Secondo me:
- il metodo pop è equivalente a remove(0)
- il metodo push(E) è equivalente a add(0,E)
Registrato
dennis87
Newbie
*

Karma: +0/-1
Scollegato Scollegato

Messaggi: 25


Mostra profilo E-mail
« Risposta #3 inserita:: Giugno 15, 2012, 07:22:06 pm »

non è cosi in quanto verrebbe come l'altra funzione e l'output sarebbe uguale e quindi sbagliato.
Registrato
mega_saiyan
Sr. Member
****

Karma: +16/-14
Scollegato Scollegato

Messaggi: 984


Mostra profilo
« Risposta #4 inserita:: Giugno 18, 2012, 07:51:00 am »

Allora non ho capito il tuo problema. La funzione che usa pop e push funziona? Se si se sostituisci a pop e push le due istruzioni che ti ho suggerito non funziona più? Se vuoi che effettuiamo delle prove devi indicare tutte le classi coinvolte.
Registrato
dennis87
Newbie
*

Karma: +0/-1
Scollegato Scollegato

Messaggi: 25


Mostra profilo E-mail
« Risposta #5 inserita:: Giugno 18, 2012, 09:13:04 am »

la funzione che usa pop() e push() non funziona in quanto sono funzioni della LinkedList, io uso l'ArrayList che non le ha.
Registrato
ctraversa
Jr. Member
**

Karma: +14/-7
Scollegato Scollegato

Messaggi: 155


Mostra profilo
« Risposta #6 inserita:: Giugno 18, 2012, 10:17:09 am »

Ciao dennis87.
Quello che mega_saiyan vuole dirti è che se vuoi utilizzare i metodi pop() e push() su di un ArrayList, dal momento che essa non li ha, dovresti cercare di ricrearli. Quindi se in una LinkedList hai i metodi:
pop() recupera (eliminandolo) dalla cima dello stack l'elemento E
push(E e) mette sulla cima dello stack stack l'elemento E
Potresti crearti la classe MyArrayList che eredita da ArrayList in cui definisci i metodi pop() e push() che però lavorano sulla struttura dati tipica dell'ArrayList
Un esempio pratico e funzionante:
Codice:
import java.util.ArrayList;

public class MyArrayList<E> extends ArrayList {
public E pop() {
E retVal;
retVal = (E) this.get(this.size()-1);
this.remove(this.size()-1);
return retVal;
}

public void push(E e) {
this.add(e);
}
}

Puoi testare il codice con un semplice esempio come questo:
Codice:
public class MyArrayListTest {

public static void main(String[] args) {
MyArrayList<String> mal = new MyArrayList<String>();
mal.push("stringa 1");
mal.push("stringa 2");
mal.push("stringa 3");
mal.push("stringa 4");
mal.push("stringa 5");
while (!mal.isEmpty()){
System.out.println(mal.pop());
}
}
}

In questo modo hai una classe ArrayList con i metodi push e pop tipici della LinkedList
Registrato
dennis87
Newbie
*

Karma: +0/-1
Scollegato Scollegato

Messaggi: 25


Mostra profilo E-mail
« Risposta #7 inserita:: Giugno 18, 2012, 10:43:53 am »

Non mi funziona, il codice di pop e push con la linkedlist che devo modificare per farlo funzionare con arraylist è questo
Codice:
LinkedList<T> visitaDFS(){
LinkedList<T> lista=new LinkedList<T>();
LinkedList<NodoVP<T>> pila=new LinkedList<NodoVP<T>>();

//inizializzo la pila
pila.push(radice());
while(pila.size()!=0){
//estraggo
NodoVP<T> temp=pila.pop();
//visito
lista.addLast(temp.getInfo());
//inserisco i figli di chi ho visitato.
//Essi sono da ricercare!!
for(int i=0;i<numNodi();i++)
if(padri[i]==temp)
pila.push(nodi[i]);
}
System.out.println("Visita in profondita': ");
stampa_visita(lista);
return lista;
}

io attualmente ho questo
Codice:
ArrayList<T> visitaPreordine(){
      ArrayList<T> lista=new ArrayList<T>();
       MyArrayList<NodoLF<T>> pila=new MyArrayList<NodoLF<T>>();
       //pila.add(getRadice());
       pila.push(getRadice());
       while(pila.size()!=0){
          NodoLF<T> temp = pila.pop();;
          lista.add(temp.getInfo());
          //System.out.println(temp);
          //lista.add(temp.getInfo());
          //pila.addAll(0,temp.getFigli());
          for(int i=0;i<numNodi();i++)
          if(padri.get(i)==temp)
          pila.add(nodi.get(i));
       }
       System.out.println("Visita in ampiezza: ");
stampa_visita(lista);
return lista;
   }
ma non funziona, restituendomi questo errore:
Codice:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at AlberoLF.visitaPreordine(AlberoLF.java:161)
at TestAlberoLF.main(TestAlberoLF.java:150)
Registrato
mega_saiyan
Sr. Member
****

Karma: +16/-14
Scollegato Scollegato

Messaggi: 984


Mostra profilo
« Risposta #8 inserita:: Giugno 18, 2012, 11:38:43 am »

ma non funziona, restituendomi questo errore:
Codice:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at AlberoLF.visitaPreordine(AlberoLF.java:161)
at TestAlberoLF.main(TestAlberoLF.java:150)

L'errore indica che tu vuoi accedere al secondo elemento in un ArrayList con soli due elementi (quindi puoi accedere solo a quello in posizione zero o uno). Penso dipenda dal metodo numNodi perchè secondo me la riga 161 della tua classe AlberoLF è quella in cui ho messo la freccia

Codice:
for(int i=0;i<numNodi();i++)
          if(padri.get(i)==temp) <-------------------

Se è così allora il problema è che i invece di fermarsi a 1, raggiunge 2 e ciò può dipendere solo dal valore di numNodi. Se vuoi che esamini questo metodo invialo.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page