Respostas:
Java não suporta matrizes associativas, no entanto, isso pode ser facilmente alcançado usando a Map
. Por exemplo,
Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc
map.get("name"); // returns "demo"
Ainda mais preciso para o seu exemplo (já que você pode substituir String por qualquer objeto que atenda às suas necessidades) seria declarar:
List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name");
ArrayList
em quase todos os casos devido a diferenças de desempenho (inesperadas?). Mas isso é outra discussão.
HashMap
, e certamente não sem fazer um benchmark intencional do comportamento e encontrar um melhor fator de carga para o seu caso de uso. O único motivo para especificar um tamanho inicial é se você souber com antecedência que o mapa será muito grande. HashMap
não desperdiça (muita) memória se estiver vazia, mas se você pretende criar um mapa grande, pode salvar vários redimensionamentos de matriz especificando seu tamanho antecipadamente.
Java não possui matrizes associativas, como o PHP.
Existem várias soluções para o que você está fazendo, como usar um mapa, mas isso depende de como você deseja procurar as informações. Você pode escrever facilmente uma classe que contém todas as suas informações e armazenar instâncias delas em um arquivo ArrayList
.
public class Foo{
public String name, fname;
public Foo(String name, String fname){
this.name = name;
this.fname = fname;
}
}
E depois...
List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));
Então você pode acessá-los como ...
foos.get(0).name;
=> "demo"
Você pode fazer isso através do Maps. Algo como
Map<String, String>[] arr = new HashMap<String, String>[2]();
arr[0].put("name", "demo");
Mas, ao começar a usar Java, tenho certeza de que descobrirá que, se você criar uma classe / modelo que represente seus dados, serão suas melhores opções. eu faria
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);
Não existe array associativo em Java. Seu parente mais próximo é um Map
, que é fortemente tipado, mas possui sintaxe / API menos elegante.
Este é o mais próximo que você pode chegar com base no seu exemplo:
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
e InstantiateFactory
?
Veja a interface do mapa e a classe concreta HashMap .
Para criar um mapa:
Map<String, String> assoc = new HashMap<String, String>();
Para adicionar um par de valores-chave:
assoc.put("name", "demo");
Para recuperar o valor associado a uma chave:
assoc.get("name")
E, com certeza, você pode criar uma matriz de mapas, pois parece ser o que você deseja:
Map<String, String>[] assoc = ...
Bem, eu também estava em busca de matriz associativa e encontrei a lista de mapas como a melhor solução.
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 ao hash do Perl
HashMap<Integer, HashMap<String, String>> hash;
Java não possui matrizes associativas, o mais próximo que você pode obter é a interface do mapa
Aqui está um exemplo dessa 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);
}
}
Se executado com:
java Freq if it is to be it is up to me to delegate
Você terá:
8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
Matrizes associativas em Java, como no 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);
}
Mais informações, consulte Classe SoftHashMap: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html
Use ArrayList <Map <String, String>>
Aqui está um exemplo 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);
Resultado :
produtos: [{id = 0001, nome = prod1}, {id = 0002, nome = prod2}]
Na verdade, o Java suporta matrizes associativas que são chamadas de dicionários!
Pensando mais sobre isso, gostaria de lançar as tuplas como uma maneira mais geral de lidar com esse problema. Embora as tuplas não sejam nativas do Java, eu uso o Javatuples para me fornecer a mesma funcionalidade que existiria em outros idiomas. Um exemplo de como lidar com a pergunta feita é
Map<Pair<Integer, String>, String> arr = new HashMap<Pair<Integer, String>, String>();
Pair p1 = new Pair(0, "name");
arr.put(p1, "demo");
Eu gosto dessa abordagem porque ela pode ser estendida a triplos e outros agrupamentos de ordem superior com classes e métodos fornecidos pela API.
Em relação ao comentário do PHP 'Não, o PHP não gostaria'. Na verdade, o PHP continuaria fazendo chug, a menos que você defina alguns níveis de exceção / erro muito restritivos (para PHP), (e talvez nem isso ainda).
O que acontecerá por padrão é que o acesso a um elemento de matriz variável / fora dos limites não existente 'desativa' o seu valor ao qual você está atribuindo. NÃO, isso NÃO é nulo. PHP tem uma linhagem Perl / C, pelo que entendi. Portanto, existem: variáveis não definidas e não existentes, valores que SÃO configurados, mas são NULL, valores Boolean False, e tudo o mais que os idiomas padrão possuem. Você deve testá-los separadamente, OU escolher a função / sintaxe da avaliação DIREITA.
NullPointerException
se o mapa externo não contiver mapa para entrada0
. O PHP não é mais permissivo com $ arr [0] ['name'] (eu não conheço essa linguagem)?