Struttura dei dati per contenere i nomi delle colonne di Excel con i loro valori

2

Sto imparando a leggere le cartelle di lavoro di Excel in Java e voglio sapere quale sarà una buona struttura dati per contenere i nomi delle colonne con i valori al di sotto di esse.

Esempio:

Voglio poter chiamare un metodo: getColumnValue(String columnName, int indexOfValue) e ottenere il valore in quella posizione per il nome della colonna specificato.

Stavo pensando a una tabella hash con elenchi collegati. Tuttavia, sembra che ci sia un sovraccarico perché possono esserci un numero qualsiasi di colonne e valori associati.

Quale sarebbe una buona raccomandazione per questo? Grazie in anticipo!

    
posta Vylic 21.06.2016 - 16:57
fonte

2 risposte

1

Supponendo che tu abbia bisogno di una soluzione generica, in cui il programma non sia legato a una struttura di colonne specifica in fase di esecuzione, puoi utilizzare ArrayList di righe, dove ogni riga è una matrice di stringhe String[] . Avrai bisogno di un ulteriore HashTable<String,int> per memorizzare la mappatura del nome della colonna all'indice della colonna (probabilmente un HashMap funzionerà). Quindi se hai

 HashTable<String,int> columnMapping;
 ArrayList<String[]> tableValues;

puoi implementare getColumnValue di

 String getColumnValue(String columnName, int indexOfValue)
 {
     return tableValues.get(columnMapping.get(columnName))[indexOfValue];
 }

Si può prendere in considerazione l'aggiunta di qualche gestione degli errori qui, un codice che determina i nomi delle colonne e un altro codice che legge le righe excel negli array String con una voce per colonna. Se hai bisogno dei valori in un modulo tipizzato, considera di sostituire le String[] di% di Object[] e di memorizzare il contenuto della cella come oggetti di tipo String , Integer , Double o Date . Puoi anche implementare una classe speciale CellContent e memorizzare le tue righe come CellContent[] matrici, se hai requisiti specifici e la necessità di implementare comportamenti o metodi specifici per un elemento di contenuto.

Si noti che si tratta di una scetch approssimativa di una soluzione generica. Si può modificare questo e creare diverse varianti, per requisiti più specifici.

Se hai bisogno di una variante generica less , poiché il tuo programma si aspetta una struttura di colonne specifica, la soluzione migliore è probabilmente quella di creare una classe DTO specifica MyRowType per contenere i valori specifici di una riga, e usa una variabile come ArrayList<MyRowType> tableValues per la memorizzazione del contenuto della tabella.

    
risposta data 21.06.2016 - 17:18
fonte
0

Se hai bisogno di prestazioni, probabilmente hai bisogno di Array per mantenere i valori delle colonne, altrimenti 1. avrai overhead di memoria e 2. l'accesso alle file in basso sarà lento.

Le colonne possono essere sia una Hashmap (nome - > Array) che direttamente campi Oggetto (quest'ultima è preferibile ma richiede che i campi e i tipi siano noti staticamente).

Questa sarebbe la risposta base, basata su colonne, che presuppone che i tipi in ogni colonna siano gli stessi, ogni colonna è spesso / sempre compilata e rappresenta gli stessi dati. Se i tuoi dati sono più sparsi, puoi archiviare per riga, ogni riga è una Hashmap (nome della colonna - > valore) che puoi quindi memorizzare in una matrice o in una mappa hasp.

    
risposta data 21.06.2016 - 17:11
fonte

Leggi altre domande sui tag