|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
[JAVA] Array come elemento di una collection
Domanda veloce su una questione che mi sta confondendo un po': in Java è possibile usare un array come elemento di una collection???
Una cosa del tipo: Codice:
HashMap<String,Object> map = new HashMap<String,Object>(); int[] arr1 = { 1, 2, 3 }; map.put ("arr1", arr1); Ho provato: Codice:
int[] arr_out = map.get ("arr1"); ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Anzi posso anche fare così: Codice:
Object o = map.get ("arr1"); if (o instanceof int[]) { int[] arr = (int[]) o; .... }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Oppure dichiarare la mappa come <String, int[]>
![]()
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
Quote:
__________________
![]() |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
![]()
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Devo implementare un sistema per passare dei dati (parametri) da una applicazione "C" ad una Java. L'applicazione C è molto grossa ed è sviluppata sia da me (in parte minore) che da altre persone. L'applicazione Java la sto sviluppando adesso io da zero. Tutte le specifiche me le sto "inventando" io, quindi posso fare un po' come mi pare ![]() Per quanto riguarda il passaggio fisico dei dati, ho pensato di usare un file XML del tipo: Codice:
<?xml version='1.0' encoding='iso-8859-1'?> <parameters> <parameter type="string" name="nome1" value="aaaa" /> <parameter type="int[2][2]" name="nome2"> <values> <values> <value>123</value> <value>456</value> </values> <values> <value>1111</value> <value>4444</value> </values> </values> </parameter> </parameters> Questa Map ha quindi delle stringhe come chiave e poi ..... direi un Object come valore. Questo perché dentro posso avere una String, un Integer (che poi converto in int), un Double (che poi converto in double) o un int[], double[][], ecc.... Ti sembra buona come idea o no??? Nel caso non sia una buona idea, cosa sarebbe meglio fare??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 30-03-2006 alle 15:47. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Scusa se rispondo solo adesso. Per come hai esposto il problema direi che non ci sono elementi sufficienti per affermare che il design non è buono... però immagino che ci sia ben più semantica di così.
Per quanto riguarda il formato dell'XML può andare bene, visto che apparentemente non ci sono vincoli. Non conoscendo l'utilizzo e l'utilizzatore di questi 'parametri', non posso suggerire miglioramenti, se non l'adozione di un'altro tipo di collezione: un'implementazione di List<Parameter>, dove Parameter è un'interfaccia (parametrica?) col metodo getValue(). Questo porterebbe qualche vantaggio anche in fase di progettazione del parser stesso: si potrebbe pensare ad una architettura a plugin dove hai un engine di parsing che si limita a riconoscere i tag <parameter> e in base al suo attributo 'type' cerca nei suoi ParameterParser registrati quello che supporta il valore dell'attributo, per poi delegare ad esso il parsing del tag stesso. Per essere più chiaro: Codice:
// pseudocodice che presuppone la lettura in 'pull' dei tag XML: Map<String, ParameterParser> registeredParsers = ...; List<Parameter> paramList = new ArrayList<Parameter>(); for (String tag : tags) { if ("parameter".equals(tag.getName())) { String tagType = tag.getAttribute("type"); paramList.add(registeredParsers.get(tagType).parse(tag)); } } La lista è consigliabile perchè più rassomigliante alla fonte dati (stream XML) finchè non ci sono validi motivi per preferirgli la mappa, visto che per gli ordinamenti esistono i metodi sort() della classe Collections che puoi utilizzare in ogni momento. Spero di esserti stato utile. ![]()
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
![]() |
![]() |
![]() |
#10 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quote:
La necessità era quello di poter creare dei grafici (diagrammi a barre, a torta, ecc...) e l'idea che mi era venuta è quella di usare Java insieme alla libreria JFreeChart (non so se la conosci). Questa libreria ho già avuto modo di provarla e la trovo molto utile e valida. In sostanza è per questo motivo che devo creare un piccolo strato software in Java che si occupa di prelevare tutti i dati generati dall'applicazione "C" per poi renderli disponibili ad altre classi (che svilupperò io oppure anche altre persone) che si occuperanno di creare a video i grafici. Il codice che mi hai postato non mi è chiaro al 100%, comunque ho capito il concetto che volevi esprimere: creare un sistema a plugin in cui una certa classe conosce, a run-time, tutte le classi relative ai parametri e in base al nome del tag XML, richiama la classe corrispondente per delegargli l'elaborazione dei tag. Giusto? Comunque mi sembra un po' complesso per quello che volevo fare io. A me invece è venuta in mente la seguente cosa. Creare una classe astratta GenericParameter che contiene tutti i metodi get/set possibili (es. getString, getInt, getDoubleArray1D, setDouble, ecc...). Ognuno di questi metodi, nella classe astratta, ha come unica implementazione il lancio di una eccezione (es. IllegalOperationException che creo io). Da questa classe astratta derivo N classi es. StringParameter, DoubleArray1DParameter, ecc... In queste sottoclassi gestisco solo i metodi che sono "il linea" con il tipo di dato gestito. A questo punto posso avere un TreeMap<String,GenericParameter>. Nota che preferirei usare una Map invece di una lista. Ad ogni parametro è associato un nome, quindi è una gestione "associativa". Le classi che si occuperanno di creare i grafici, estrarranno i dati "per nome". Una cosa che si potrebbe obiettare a questo metodo è che per creare un nuovo tipo di dato (sottoclasse), bisogna modificare anche la classe base astratta. È un cattivo design?? Cosa ne pensi?? Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
![]() |
![]() |
![]() |
#11 | |||
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
Quote:
Quote:
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:58.