Respuestas:
Java no admite matrices asociativas, sin embargo, esto podría lograrse fácilmente utilizando a Map
. P.ej,
Map<String, String> map = new HashMap<String, String>();
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 String con cualquier objeto que satisfaga sus necesidades) sería declarar:
List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name");
ArrayList
en casi todos los casos debido a inesperados (?) Las diferencias de rendimiento. Pero esa es otra discusión.
HashMap
, y ciertamente no sin comparar intencionalmente el comportamiento y encontrar un mejor factor de carga para su caso de uso. La única razón para especificar un tamaño inicial es si sabe de antemano que el mapa será muy grande. HashMap
no desperdicia (mucha) memoria si está vacía, pero si tiene la intención de crear un mapa grande, puede guardar varios tamaños de matriz especificando su tamaño por adelantado.
Java no tiene matrices asociativas como PHP.
Existen varias soluciones para lo que está haciendo, como usar un Mapa, pero depende de cómo desee buscar la información. Puede escribir fácilmente una clase que contenga toda su información y almacenar instancias de ellos en un archivo ArrayList
.
public class Foo{
public String name, fname;
public Foo(String name, String fname){
this.name = name;
this.fname = fname;
}
}
Y entonces...
List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));
Para que pueda acceder a ellos como ...
foos.get(0).name;
=> "demo"
Puede lograr esto a través de Maps. Algo como
Map<String, String>[] arr = new HashMap<String, String>[2]();
arr[0].put("name", "demo");
Pero cuando comience 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<Person> people = new ArrayList<Person>();
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 a Map
, que está fuertemente tipado, pero tiene una sintaxis / API menos elegante.
Esto es lo más cercano que puede obtener según su ejemplo:
Map<Integer, Map<String, String>> 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
LazyMap.decorate
y qué InstantiateFactory
?
Mire la interfaz de Mapa y la clase concreta HashMap .
Para crear un mapa:
Map<String, String> assoc = new HashMap<String, String>();
Para agregar un par clave-valor:
assoc.put("name", "demo");
Para recuperar el valor asociado con una clave:
assoc.get("name")
Y claro, puede crear una serie de mapas, ya que parece ser lo que desea:
Map<String, String>[] assoc = ...
Bueno, también estaba buscando 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<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", "Vla2");
myMap1.put("PROGRESS", "Vla2");
myMap.add(0,myMap1);
myMap.add(1,myMap1);
for (Map<String, String> map : myMap) {
System.out.println(map.get("URL"));
}
//System.out.println(myMap);
}
}
Java equivalente al hash de Perl
HashMap<Integer, HashMap<String, String>> hash;
Java no tiene matrices asociativas, lo más parecido que puede obtener es la interfaz de Mapa
Aquí hay una muestra de esa página.
import java.util.*;
public class Freq {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
// 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}
Matrices asociativas 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 <Map <String, String>>
Aquí un ejemplo de código:
ArrayList<Map<String, String>> products = new ArrayList<Map<String, String>>();
while (iterator.hasNext()) {
Map<String, String> product = new HashMap<String, String>();
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, nombre = prod1}, {id = 0002, nombre = prod2}]
¡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, yo uso las tuplas de Java para proporcionarme la misma funcionalidad que existiría en otros idiomas. Un ejemplo de cómo lidiar con la pregunta formulada es
Map<Pair<Integer, String>, String> arr = new HashMap<Pair<Integer, String>, String>();
Pair p1 = new Pair(0, "name");
arr.put(p1, "demo");
Me gusta este enfoque porque puede extenderse a triples y otras agrupaciones de orden superior con clases y métodos proporcionados por API.
En cuanto al comentario de PHP 'No, a PHP no le gustaría'. En realidad, PHP seguiría funcionando a menos que establezcas algunos niveles de excepción / error muy restrictivos (para PHP) (y tal vez ni siquiera entonces).
Lo que PASARÁ por defecto es que un acceso a un elemento de matriz variable / fuera de límites no existente 'desarma' su valor al que está asignando. NO, eso NO es nulo. PHP tiene un linaje Perl / C, por lo que entiendo. Entonces hay: variables no establecidas y no existentes, valores que ESTÁN establecidos pero son NULOS, valores falsos booleanos, luego todo lo demás que tienen los idiomas estándar. Debe probarlos por separado, O elegir la función / sintaxis incorporada de la evaluación CORRECTA.
NullPointerException
si el mapa externo no contiene un mapa para la entrada0
. ¿No es PHP más permisivo con $ arr [0] ['nombre'] (no conozco este lenguaje en absoluto)?