2012-07-19 21 views
6

Tengo un Hashtable que tiene una clave de String y el valor como String, pero he llegado a un punto en mi proyecto en el que necesito poder almacenar varios tipos de datos diferentes. Por ejemplo, voy a necesitar almacenar int, String, Date, etc., todo en uno Hashtable.¿Hay alguna manera de almacenar múltiples tipos de datos en una única variable hashtable?

+3

Cambia la clave a 'Objeto'? – Mysticial

+1

¿No es una buena opción crear un objeto con get/set y agregar ese objeto HashTable/ArrayList (o) cualquiera que sea la colección que le interese? Si agrega varios tipos de datos, mientras recupera si no conoce el índice exacto y el tipo de datos, terminará con classcastexception. – kosa

+0

Esto suena como una estructura de datos muy frágil. ¿Podría describir qué es lo que está tratando de lograr en general, por lo que tal vez alguien pueda sugerir una forma de estructurar mejor sus datos? – Bobulous

Respuesta

7

HashTable o cualquier colección Map puede manejar esto, a excepción de int y otros tipos primitivos: no se puede almacenar tipos primitivos, sólo Object referencias. int tendrá que ser envuelto como un objeto Integer.

+0

Entonces, ¿podré recuperarlo como el tipo de datos que se almacenó? – samwell

+2

No realmente, no, no sin un elenco, y todavía será meticuloso.Estarías mucho mejor usando diferentes mapas para diferentes tipos, o mejor aún, simplemente creando una clase con campos con cada uno de los diferentes nombres, en lugar de tener un 'Mapa' en el que esperas que te asegures de que todo esté bien. del tipo correcto. –

4

Puede hacer que almacene el tipo de datos generales Object, aunque eso no permitirá tipos de datos primitivos.

0

Cambie su HashTable a Hashtable<String, Object> y cuando desee almacenar un int, primero debe convertirlo (o usar autocast) a Integer. Después de obtener su valor de la tabla, puede determinar su tipo por if(value instanceof String), y así sucesivamente para cualquier tipo.

+4

No hay necesidad de encasillar - el autoboxing lo hará automáticamente (Java 5+). – 01es

+3

La clase se llama Hashtable y toma dos parámetros de tipo, no uno. –

6
Map<String, Object> map = new HashMap<String, Object>() 

Esto le da un mapa con las teclas de tipo String y los valores de Tipo del objeto, lo que básicamente significa cualquier descendiente de tipo Object (Fecha, entero, cadena, etc.). Otras respuestas señalan correctamente al hecho de que en lugar de utilizar los primitivos como int, boolean que es necesario para utilizar sus homólogos de enteros, booleanos, etc.

El tipo de retorno de get operación en tal mapa es Object. Por lo tanto, es responsabilidad del desarrollador manejar la información de tipo correctamente.

Se proporciona una buena respuesta a la pregunta sobre cuál es la diferencia entre Hashtable y HashMap here.

4

Si bien esto es posible, generalmente no es una buena idea. En la mayoría de los casos, esto conduce a excepciones y problemas de conversión de tipo.

La tabla HashTable se puede configurar para almacenar objetos genéricos en lugar de tipos de clase específicos; sin embargo, la conversión de tipo al recuperarlos no ocurre automáticamente.

Para volver a sacar el objeto de la colección, se deberá desarrollar alguna forma de rutinas de verificación de tipos.

Será mejor que cree una colección separada para cada tipo de clase que desee almacenar.

PD: También recomendaría usar un HashMap en lugar de HashTable. HashTable ha quedado obsoleto.

+0

Gracias, no lo sabía. – samwell

Cuestiones relacionadas