2010-05-08 10 views
37

Questo è quello che ho cercato di fare, ma mi dà un avvertimento:Come fare una matrice di hashmap?

HashMap<String, String>[] responseArray = new HashMap[games.size()]; 

Type safety: The expression of type HashMap[ ] needs unchecked conversion to conform to HashMap[ ]

risposta

45

Che cosa dà? Funziona. Basta ignorarlo:

@SuppressWarnings("unchecked") 

No, cannot parametrizzarlo. Preferirei invece usare un List<Map<K, V>>.

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

Per saperne di più sulle collezioni e le mappe, uno sguardo ai this tutorial.

+1

Grazie. L'ho fatto funzionare usando una lista di mappe. Non mi piace ignorare gli avvertimenti. Nella mia esperienza, se ricevi un avvertimento, lo fai. L'unica cosa che non capisco è il motivo per cui lo dichiaro come un tipo di mappa, ma quando effettivamente lo istanziamo devo usare HashMap? Mappa responseMap; responseMap = new HashMap (); – Joren

+0

È un'interfaccia. Un progetto. Un contratto. Segui il link :) – BalusC

+0

Perché preferiresti usare Lista di Mappe e poi una HashMap, per favore spiega. – Daniel

3

Non è possibile avere un array di un tipo generico. Utilizzare invece List.

+0

In realtà, è possibile * avere * un array di un tipo generico, non è possibile * creare * uno direttamente.(Non presumo di capire la logica alla base di questo, ma questo è quello che dice la specifica) – meriton

5

Il linguaggio Java Specification, sezione 15.10, afferma:

An array creation expression creates an object that is a new array whose elements are of the type specified by the PrimitiveType or ClassOrInterfaceType. It is a compile-time error if the ClassOrInterfaceType does not denote a reifiable type (§4.7).

e

The rules above imply that the element type in an array creation expression cannot be a parameterized type, other than an unbounded wildcard.

Il più vicino si può fare è utilizzare un cast incontrollato, sia dal tipo grezzo, come avete fatto o da un carattere jolly illimitato:

HashMap<String, String>[] responseArray = (Map<String, String>[]) new HashMap<?,?>[games.size()]; 

La tua versione è chiaramente migliore :-)

9

si può usare qualcosa di simile:

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 


public class testHashes { 

public static void main(String args[]){ 
    Map<String,String> myMap1 = new HashMap<String, String>(); 

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

    myMap1.put("URL", "Val0"); 
    myMap1.put("CRC", "Vla1"); 
    myMap1.put("SIZE", "Val2"); 
    myMap1.put("PROGRESS", "Val3"); 

    myMap.add(0,myMap1); 
    myMap.add(1,myMap1); 

    for (Map<String, String> map : myMap) { 
     System.out.println(map.get("URL")); 
        System.out.println(map.get("CRC")); 
        System.out.println(map.get("SIZE")); 
        System.out.println(map.get("PROGRESS")); 
    } 

    //System.out.println(myMap); 

} 


} 
+0

Ottengo l'errore: (19, 15) java: atteso –

4

Java non vuole a fare una serie di HashMaps, ma vi permetterà di effettuare una serie di oggetti. Quindi, scrivi una dichiarazione di classe come shell attorno alla tua HashMap e crea una matrice di quella classe. Ciò ti consente di memorizzare alcuni dati extra su HashMaps, se lo desideri, il che può essere un vantaggio, dato che hai già una struttura dati piuttosto complessa.

come si presenta:

private static someClass[] arr = new someClass[someNum]; 

e

public class someClass { 

private static int dataFoo; 
private static int dataBar; 
private static HashMap<String, String> yourArray; 

... 

} 
Problemi correlati