Matriz asociativa de Java

¿Cómo puedo crear y obtener matrices asociativas en Java como puedo en PHP?

Por ejemplo:

$arr[0]['name'] = 'demo'; $arr[0]['fname'] = 'fdemo'; $arr[1]['name'] = 'test'; $arr[1]['fname'] = 'fname'; 

Java no admite matrices asociativas, sin embargo, esto podría lograrse fácilmente utilizando un Map . P.ej,

 Map map = new HashMap(); map.put("name", "demo"); map.put("fname", "fdemo"); // etc map.get("name"); // returns "demo" 

Aún más preciso para su ejemplo (ya que puede reemplazar a String con cualquier objeto que satisfaga sus necesidades) sería declarar:

 List> data = new ArrayList<>(); data.add(0, map); data.get(0).get("name"); 

Ver la documentación oficial para más información

Java no tiene matrices asociativas como PHP.

Hay varias soluciones para lo que está haciendo, como usar un Mapa, pero depende de cómo quiera buscar la información. Puede escribir fácilmente una clase que contenga toda su información y almacenar instancias de ellos en una ArrayList .

 public class Foo{ public String name, fname; public Foo(String name, String fname){ this.name = name; this.fname = fname; } } 

Y entonces…

 List foos = new ArrayList(); foos.add(new Foo("demo","fdemo")); foos.add(new Foo("test","fname")); 

Para que pueda acceder a ellos como …

 foos.get(0).name; => "demo" 

Puedes lograr esto a través de Maps. Algo como

 Map[] arr = new HashMap[2](); arr[0].put("name", "demo"); 

Pero a medida que empiece a usar Java, estoy seguro de que encontrará que si crea una clase / modelo que represente sus datos, serán sus mejores opciones. yo lo haría

 class Person{ String name; String fname; } List people = new ArrayList(); Person p = new Person(); p.name = "demo"; p.fname = "fdemo"; people.add(p); 

No existe una matriz asociativa en Java. Su pariente más cercano es un Map , que está fuertemente tipado, sin embargo tiene una syntax / API menos elegante.

Esto es lo más cercano que puede obtener basado en su ejemplo:

 Map> arr = org.apache.commons.collections.map.LazyMap.decorate( new HashMap(), new InstantiateFactory(HashMap.class)); //$arr[0]['name'] = 'demo'; arr.get(0).put("name", "demo"); System.out.println(arr.get(0).get("name")); System.out.println(arr.get(1).get("name")); //yields null 

Mire la interfaz de Mapa , y en la clase concreta HashMap .

Para crear un mapa:

 Map assoc = new HashMap(); 

Para agregar un par clave-valor:

 assoc.put("name", "demo"); 

Para recuperar el valor asociado con una clave:

 assoc.get("name") 

Y seguro, puedes crear una matriz de Mapas, ya que parece ser lo que quieres:

 Map[] assoc = ... 

Java equivalente al hash de Perl

 HashMap> hash; 

Java no tiene matrices asociativas, lo más cercano que puede obtener es la interfaz de Map

Aquí hay una muestra de esa página.

 import java.util.*; public class Freq { public static void main(String[] args) { Map m = new HashMap(); // Initialize frequency table from command line for (String a : args) { Integer freq = m.get(a); m.put(a, (freq == null) ? 1 : freq + 1); } System.out.println(m.size() + " distinct words:"); System.out.println(m); } } 

Si se ejecuta con:

 java Freq if it is to be it is up to me to delegate 

Obtendrás:

 8 distinct words: {to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2} 

Bueno, yo también estaba en búsqueda de una matriz asociativa y encontré la Lista de mapas como la mejor solución.

 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 myMap1 = new HashMap(); List> myMap = new ArrayList>(); myMap1.put("URL", "Val0"); myMap1.put("CRC", "Vla1"); myMap1.put("SIZE", "Vla2"); myMap1.put("PROGRESS", "Vla2"); myMap.add(0,myMap1); myMap.add(1,myMap1); for (Map map : myMap) { System.out.println(map.get("URL")); } //System.out.println(myMap); } } 

A diferencia de los lenguajes como PHP, en Java, no hay matrices asociativas. Un método más conveniente para usar una matriz asociativa equivalente es usar un HashMap donde puede usar la clave de HashMap para proporcionar la calidad de matriz asociativa.

Conjuntos asociativos en Java como en PHP:

 SlotMap hmap = new SlotHashMap(); String key = "k01"; String value = "123456"; // Add key value hmap.put( key, value ); // check if key exists key value if ( hmap.containsKey(key)) { //..... } // loop over hmap Set mapkeys = hmap.keySet(); for ( Iterator iterator = mapkeys.iterator(); iterator.hasNext();) { String key = (String) iterator.next(); String value = hmap.get(key); } 

Más información, consulte Clase SoftHashMap: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html

Utilice ArrayList

>

Aquí una muestra de código:

 ArrayList> products = new ArrayList>(); while (iterator.hasNext()) { Map product = new HashMap(); Element currentProduct = iterator.next(); product.put("id",currentProduct.get("id")); product.put("name" , currentProduct.get("name") ); products.add(product ); } System.out.println("products : " + products); 

Salida:

productos: [{id = 0001, name = prod1}, {id = 0002, name = prod2}]

En JDK 1.5 (http://tinyurl.com/3m2lxju) hay incluso una nota: “NOTA: esta clase está obsoleta. Las nuevas implementaciones deberían implementar la interfaz de Map, en lugar de extender esta clase”. Saludos, N.

 Object[][] data = { {"mykey1", "myval1"}, {"mykey2", "myval2"}, {new Date(), new Integer(1)}, }; 

Sí, esto requiere iteración para buscar valor por clave, pero si los necesita a todos, esta será la mejor opción.

¡En realidad, Java admite matrices asociativas que se llaman diccionarios!

Pensando más en ello, me gustaría descartar las tuplas como una forma más general de tratar este problema. Si bien las tuplas no son nativas de Java, utilizo Javatuples para proporcionarme la misma funcionalidad que existiría en otros idiomas. Un ejemplo de cómo lidiar con la pregunta es

 Map, String> arr = new HashMap, String>(); Pair p1 = new Pair(0, "name"); arr.put(p1, "demo"); 

Me gusta este enfoque porque se puede extender a triples y otras agrupaciones ordenadas superiores con clases y métodos proporcionados por API.

En cuanto al comentario PHP ‘No, PHP no le gustaría’. En realidad, PHP seguiría funcionando a menos que establezca unos niveles de excepción / error muy restrictivos (para PHP) (y tal vez ni siquiera entonces).

Lo que sucederá de forma predeterminada es que un acceso a un elemento de matriz variable / fuera de límites no existente ‘desactive’ el valor que está asignando. NO, eso NO es nulo. PHP tiene un linaje Perl / C, por lo que entiendo. Entonces, existen: variables no establecidas y no existentes, valores que están configurados pero son valores NULL, Boolean False, y todo lo demás que tienen los lenguajes estándar. Debe probarlos por separado, O elija la evaluación DERECHA incorporada en la función / syntax.