2011-03-27 12 views
5

Necesito una matriz de Hashtables en un programa que almacena todas las palabras de un conjunto determinado de documentos.Java array of Hashtables

El índice 1 de la matriz contiene una tabla hash de String -> Double que almacena una palabra y su recuento para el documento 1 (índice de matriz 100 = hashtable de número de documento 100).

No necesito ayuda para usar esta estructura de datos, solo para crearla. que declara la matriz Hashtable de la siguiente manera:

Hashtable<String,Double>[] h1 = new Hashtable<String,Double>[]; 

... pero esto no compila.

(NOTA: El doble es necesaria en lugar de un número entero en la declaración anterior para un uso posterior.)

PREGUNTA: ¿Cómo crea una serie de tablas hash que almacena String> Doble ???

Cualquier sugerencia chicos apreciados ....

+4

http://stackoverflow.com/questions/2792731/how-to-do-an-array-of-hashmaps –

Respuesta

4

... pero esto no compila.

Eso es porque la matriz no tiene nombre, new espera una serie de elementos y no se puede simplemente asignar una matriz de generics. Prefiero un lugar List:

List<Hashtable<String,Double>> wordCountPerDoc 
    = new ArrayList<Hashtable<String,Double>>(); 
+0

Gracias error tipográfico, por favor ver las ediciones –

+0

lo siento, pero no puedes hacer esto de esa manera :) si no me crees, intenta compilarlo – smas

+0

@smas: tienes razón, thinko, arreglado. –

4

sólo tiene que utilizar

@SuppressWarnings("unchecked") 
    Hashtable<String,Double>[] h = (Hashtable<String,Double>[])new Hashtable<?,?>[10]; 
    h[0] = new Hashtable<String, Double>(); 
2

puede crear de esta manera.

Hashtable<String,Double>[] arr = new Hashtable[10]; 
1

Dos cosas: no se puede declarar una matriz con los tipos parametrizados de esa manera; debes implicar declararlo como new Hashtable[]. Y necesitas darle una longitud a la matriz.

Mezclar matrices y colecciones, aunque es posible, tiende a ser confuso y conduce a problemas en mi experiencia; también HashMap generalmente se prefiere a Hashtable. Así que tendería a preferir un List<Map<String, Double>> para esta aplicación.

3

¿por qué no utiliza un Map<Integer, Map<String, Double> >? de esta manera no desperdicia espacio para documentos no existentes, y aún obtiene la recuperación de O (1).

0

Las razones por las que esto es un error se tratan en los genéricos FAQ de Angelika Langer: Can I create an array whose component type is a concrete parameterized type?

¿Puedo crear una matriz cuyo tipo de componente es un tipo parametrizado concreto?

No, porque no es seguro.

Las matrices son covariante, lo que significa que una serie de referencias supertipo es un supertipo de una matriz de subtipo referencias.Es decir, Object[] es un supertipo de String[] y se puede acceder a una serie a través de una variable de referencia de tipo Object[].

Las matrices y los genéricos pueden tener interacciones extrañas (en gran parte debido a compromisos de implementación para admitir compatibilidad). Puede estar mejor (como larsmans suggested) buscando un tipo de colección adecuada, como List de Map s.

0

Una matriz parece ser una elección inusual de estructura aquí. Quizás debería considerar almacenar sus hashtables en una lista. Te cambiará el tamaño dinámicamente si no sabes cuántos documentos tendrás con anticipación. Si usa un ArrayList, aún tendrá lecturas de indeterminaciones aleatorias a tiempo constante (como una matriz). Creo que es mucho más simple que usar una matriz, y todavía obtiene la verificación de tipo genérica. Si elige una lista, que se convierte en la sintaxis:

List<Map<String,Double>> documentWordCounts = new ArrayList<Map<String,Double>>(); 

O elija un LinkedList dependiendo de qué tipo de patrón de lectura/escritura que desea.

0

Para el tamaño de matriz fija:

Hashtable<String,Double>[] h1 = new Hashtable[]{new Hashtable< String,Double>(),new Hashtable< String,Double>(),new Hashtable< String,Double>()};