2009-11-09 11 views
5

¿Cuál es la forma más fácil de convertir una matriz 2D de cadenas en una HashMap?conversión de matriz de cadenas 2D estática a HashMap

Por ejemplo, tome esto:

 
final String[][] sheetMap = { /* XSD Name, XSL Sheet Name */ 
           {"FileHeader", "FileHeader"}, 
           {"AccountRecord", "AccountRecord"}, 
           {"DriverCardRecord", "DriverCardRecord"}, 
           {"AssetCardRecord", "AssetCardRecord"}, 
           {"SiteCardRecord", "SiteCardRecord"} 
          }; 

Esto es más probable que va a ser cargado desde un archivo y será mucho más grande.

+0

probablemente debería añadir que no sea sólo un bucle a través de los elementos, que estoy haciendo ahora, ¿existe un método Colecciones puedo usar sólo para pasar esta matriz 2D a una instancia de HashMap? – Casey

+1

No es que yo sepa, y no creo que sea posible implementar algo más eficiente que un simple bucle sobre todos los elementos de la matriz. Por lo tanto, no ganarías nada por encima de una brevedad, que podrías duplicar de nuevo al poner esto en tu propia clase de tipo 'Utils'. –

Respuesta

20
final Map<String, String> map = new HashMap<String, String>(sheetMap.length); 
for (String[] mapping : sheetMap) 
{ 
    map.put(mapping[0], mapping[1]); 
} 
+0

+1 me ganaste por unos segundos :-) –

+1

+1: A veces la solución más simple = es = la mejor solución. – DivineWolfwood

4

Si lo que desea es inicializar el mapa de una manera conveniente, puede utilizar double brace initialization:

Map<String, String > sheetMap = new HashMap<String, String >() {{ 
    put("FileHeader", "FileHeader"); 
    put("AccountRecord", "AccountRecord"); 
    put("DriverCardRecord", "DriverCardRecord"); 
    put("AssetCardRecord", "AssetCardRecord"); 
    put("SiteCardRecord", "SiteCardRecord"); 
}}; 
+0

Esto puede tener algunas consecuencias negativas y se considera ampliamente un anti-patrón - https://blog.jooq.org/2014/12/08/dont-be-clever-the-double-curly-braces-anti-pattern/ –

2

de espera; si esto se va a cargar desde un archivo, ¡no haga pase por el paso de la matriz intermedia! Tendría que haberlo cargado todo antes de crear la matriz o no sabría el tamaño de la matriz. Simplemente crea un HashMap y agrega cada entrada a medida que la lees.

+0

Sí, ese es el plan. Sin embargo, no sé dónde se almacenará la información en este momento, así que la codifiqué en el arreglo.Se planteó la cuestión de si el marco de Colecciones ya contenía un método de utilidad para llevar a cabo esta tarea, a pesar de que es trivial de implementar. Prefiero usar un método en las colecciones siempre que sea posible. – Casey

+0

ah. bueno, si, no es así si lo hiciera, aceptaría una Colección de algo, no una matriz. Tal vez de Map.Entry's. Pero esto no es realmente muy útil. Looping es mejor. –

0

Las respuestas existentes funcionan bien, por supuesto, pero en aras de la actualización continua de este sitio con nueva información, aquí hay una manera de hacerlo en Java 8:

String[][] arr = {{"key", "val"}, {"key2", "val2"}}; 
HashMap<String, String> map = Arrays.stream(arr) 
     .collect(HashMap<String, String>::new, 
       (mp, ar) -> mp.put(ar[0], ar[1]), 
       HashMap<String, String>::putAll); 

Java 8 Stream s son impresionantes, y os animo a mirar hacia arriba para obtener información más detallada, pero aquí están los fundamentos para esta operación en particular:

  • Arrays.stream recibirá una Stream<String[]> a trabajar.
  • collect toma su Stream y lo reduce a un solo objeto que recopila todos los miembros. Toma tres funciones. La primera función, el proveedor, genera una nueva instancia de un objeto que recopila los miembros, por lo que en nuestro caso, solo el método estándar para crear un HashMap. La segunda función, el acumulador, define cómo incluir un miembro de Stream en el objeto de destino, en su caso simplemente queremos put la clave y el valor, definidos como el primer y segundo valor de cada conjunto, en el mapa. La tercera función, el combinador, es aquella que puede combinar dos objetos de destino, en caso de que, por cualquier razón, la JVM decidió realizar el paso de acumulación con múltiples HashMap s (en este caso, o cualquier otro objeto de destino en otro caso)) y luego necesita combinarlos en uno, que es principalmente para la ejecución asincrónica, aunque eso normalmente no sucederá.
1

Como alternativa un poco más limpio para tradeJmark respuesta:

String[][] arr = // your two dimensional array 
Map<String, String> arrMap = Arrays.stream(arr).collect(Collectors.toMap(e -> e[0], e -> e[1])); 

// Sanity check! 
for (Entry<String, String> e : arrMap.entrySet()) { 
    System.out.println(e.getKey() + " : " + e.getValue()); 
} 
Cuestiones relacionadas