2010-05-08 4 views
37

C'est ce que j'ai essayé de le faire, mais il me donne un avertissement:Comment faire un tableau de hashmaps?

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

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

Répondre

45

Qu'est-ce qui se passe? Ça marche. Il suffit de l'ignorer:

@SuppressWarnings("unchecked") 

Non, vous cannot le paramétrer. Je préfère cependant utiliser un List<Map<K, V>> à la place.

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

Pour en savoir plus sur les collections et les cartes, un coup d'oeil à this tutorial.

+1

Merci. Je l'ai eu en utilisant une liste de cartes. Je n'aime pas ignorer les avertissements. D'après mon expérience, si vous recevez un avertissement, allez-y. La seule chose que je ne comprends pas, c'est pourquoi je le déclare comme un type Map, mais quand je l'instancie réellement, je dois utiliser HashMap? Carte responseMap; responseMap = new HashMap (); – Joren

+0

C'est une interface. Un plan. Un contrat. Suivez le lien :) – BalusC

+0

Pourquoi préférez-vous utiliser la liste des cartes puis un HashMap, s'il vous plaît expliquer. – Daniel

3

Vous ne pouvez pas avoir un tableau d'un type générique. Utilisez List à la place.

+0

En fait, vous pouvez * avoir * un tableau d'un type générique, vous ne pouvez pas * en créer un * directement.(Je ne présume pas de comprendre la logique derrière cela, mais c'est ce que la spécification dit) – meriton

5

La spécification du langage Java, section 15.10, déclare:

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).

et

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

Le plus proche que vous pouvez faire est d'utiliser une distribution non contrôlée, que ce soit à partir du type cru, comme vous l'avez fait ou à partir d'un caractère générique illimité:

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

Votre version est nettement meilleure :-)

9

Vous pouvez utiliser quelque chose comme ceci:

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

Je reçois erreur: (19, 15) java: attendu –

4

Java ne veut pas que vous fassiez un tableau de HashMaps, mais il vous permettra de faire un tableau d'objets. Alors, écrivez juste une déclaration de classe comme un shell autour de votre HashMap, et faites un tableau de cette classe. Cela vous permet de stocker des données supplémentaires sur les HashMaps si vous le souhaitez - ce qui peut être un avantage, étant donné que vous avez déjà une structure de données quelque peu complexe.

Qu'est-ce que cela ressemble à:

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

et

public class someClass { 

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

... 

} 
Questions connexes