Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema con i puntatori relativi alla copia di una hashmap

    Salve ragazzi, ho un enorme problema.

    Vi illustro un attimo la situazione.

    Ho una tabella con associato un mio tableModel. Con questa tabella, io posso fare diverse operazioni, aggiungere valori, eliminare righe ecc ecc.

    Ho bisogno di realizzare una funzione che mi consente di tornare indietro.

    Ad esempio ho 6 righe con alcuni valori, cancello una riga, ma mi accorgo che ho sbagliato, clicco sul tasto indietro e riporto la tabella nella situazione precedente quindi come accade un attimo in excel, word ecc ecc.

    Per fare questo ho creato una classe apposita in cui ad ogni operazione che eseguo memorizza l'hash map associato al mio tableModel.

    L'idea è memorizzo in un vettore tutti gli hashMap poi con un contatore prendo l'hash map relativo alla posizione 1 2 3 ecc ecc.

    Il problema sono i puntatori, in pratica nel vettore ho 6 hashmap e tutti hanno i valori relativi all'ultima operazione è come se tutti gli hash map puntano alla stessa locazione di memoria.

    Come posso ovviare?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Problema con i puntatori relativi alla copia di una hashmap

    Originariamente inviato da bircastri
    Ho una tabella con associato un mio tableModel. Con questa tabella, io posso fare diverse operazioni, aggiungere valori, eliminare righe ecc ecc.
    Innanzitutto, visto che parli di un tuo table model, sarebbe bene ed appropriato che tutte le operazioni possibili siano fattibili solo tramite metodi specifici offerti all'esterno dal model stesso.
    Questo non solo per poter "incapsulare" la logica di queste operazioni ma anche per poter incapsulare il meccanismo di "undo".

    Originariamente inviato da bircastri
    Ho bisogno di realizzare una funzione che mi consente di tornare indietro.

    Ad esempio ho 6 righe con alcuni valori, cancello una riga, ma mi accorgo che ho sbagliato, clicco sul tasto indietro e riporto la tabella nella situazione precedente quindi come accade un attimo in excel, word ecc ecc.
    Dipende da quanti livelli di "undo" vuoi gestire e dalla "granularità" del undo (es. solo l'ultima operazione, qualunque sia, oppure più operazioni fatte dopo un certo istante o stato X). Forse "granularità" non è il termine più appropriato ma ora passatemelo, non mi viene in mente altro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Allora io voglio che al termine dell'esecuzione sel metodo setValueAt();

    codice:
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
       if(columnIndex ==0){
       operazione1();
    }else{
       operazione2();
    }
    
       LinkedHashMap<String, MioOggetto> mappa = new LinkedHashMap<String, MioOggetto>();
       mappa = miotableModel.getHashMap();
       mioVettore.add(mappa);
    
    }
    insomma ogni volta che si entra neò metodo setvalueat deve memorizzare la mappa presente in quel momento nel tableModel.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da bircastri
    codice:
       LinkedHashMap<String, MioOggetto> mappa = new LinkedHashMap<String, MioOggetto>();
       mappa = miotableModel.getHashMap();
       mioVettore.add(mappa);
    insomma ogni volta che si entra neò metodo setvalueat deve memorizzare la mappa presente in quel momento nel tableModel.
    Scusa, partiamo da un attimino prima: la tua struttura dati nel model, da che cosa è composta? Da una mappa??

    Indipendentemente dal fatto che io conosca o no la tua struttura dati, viene subito immediato pensare che se quel getHashMap() restituisce sempre lo stesso oggetto, allora è chiaro che nel vettore potresti avere N riferimenti ma tutti alla stessa mappa!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Allor la mia mappa contiene di oggetti. Ogni volta che viene richiamato il metodo set value ate la mappa viene aggiornata quindi il getHashMap() restituisce sempre la mappa corretta

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    allora scusate l'intromissione, ma qualche mese fa mi è successo di implementare un sistema di undo-redo sulla selezione di nodi su un JTree. L'approccio che ho utilizzato piuttosto con successo è stato quello di crearmi una classettina apposita con alcuni campi quali: un ArrayList di TreePath (nel tuo caso potrebbe essere un ArrayList di TableModel) e un cursore (indice int) che mi dice a che punto dell'ArrayList sono.

    Quando usi l'undo-redo sposti indietro o in avanti il cursore e ritorni l'elemento dell'ArrayList di posizione corrispondente al cursore. Quando modifichi il TableModel a seguito di un'azione di inserimento/modifica/cancellazione nella JTable corrispondente, tronchi l'ArrayList alla posizione del cursore, e aggiungi in coda il TableModel aggiornato.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Allora io anche ho implementato una struttura del genere ma la cosa che non funziona è il fatto che lui copia il riferimento del tablemodel e non il valore. Quindi è come se puntassero tutti alla stessa locazione di memoria

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.