Risposte:
Java non supporta array associativi, tuttavia questo potrebbe essere facilmente ottenuto usando a Map
. Per esempio,
Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc
map.get("name"); // returns "demo"
Ancora più preciso al tuo esempio (dato che puoi sostituire String con qualsiasi oggetto che soddisfi le tue esigenze) sarebbe dichiarare:
List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name");
Vedere la documentazione ufficiale per ulteriori informazioni
ArrayList
in quasi tutti i casi, a causa di imprevisti (?) Differenze di prestazioni. Ma questa è un'altra discussione.
HashMap
, e certamente non senza fare un benchmark intenzionale del comportamento e trovare un fattore di carico migliore per il tuo caso d'uso. L'unico motivo per specificare una dimensione iniziale è se sai in anticipo che la mappa sarà molto grande. HashMap
non spreca (molta) memoria se vuota, ma se si intende creare una mappa di grandi dimensioni è possibile salvare diversi ridimensionamenti di array specificando le dimensioni in primo piano.
Java non ha array associativi come PHP.
Esistono varie soluzioni per ciò che stai facendo, come l'utilizzo di una mappa, ma dipende da come desideri cercare le informazioni. Puoi facilmente scrivere una classe che contiene tutte le tue informazioni e archiviarne istanze in un ArrayList
.
public class Foo{
public String name, fname;
public Foo(String name, String fname){
this.name = name;
this.fname = fname;
}
}
E poi...
List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));
Quindi puoi accedervi come ...
foos.get(0).name;
=> "demo"
Puoi farlo tramite Maps. Qualcosa di simile a
Map<String, String>[] arr = new HashMap<String, String>[2]();
arr[0].put("name", "demo");
Ma quando inizi a usare Java, sono sicuro che scoprirai che se crei una classe / modello che rappresenti i tuoi dati saranno le tue migliori opzioni. farei
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);
Non esiste un array associativo in Java. Il suo parente più vicino è a Map
, che è fortemente tipizzato, ma ha una sintassi / API meno elegante.
Questo è il più vicino che puoi ottenere in base al tuo esempio:
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
e roba per?
Guarda l' interfaccia della mappa e la classe concreta HashMap .
Per creare una mappa:
Map<String, String> assoc = new HashMap<String, String>();
Per aggiungere una coppia chiave-valore:
assoc.put("name", "demo");
Per recuperare il valore associato a una chiave:
assoc.get("name")
E sicuramente, puoi creare una serie di mappe, poiché sembra essere quello che vuoi:
Map<String, String>[] assoc = ...
Beh, ero anche alla ricerca di array associativi e ho trovato l'elenco delle mappe come la migliore soluzione.
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);
}
}
Equivalente Java dell'hash di Perl
HashMap<Integer, HashMap<String, String>> hash;
Java non ha array associativi, la cosa più vicina che puoi ottenere è l' interfaccia della mappa
Ecco un esempio da quella pagina.
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 eseguito con:
java Freq if it is to be it is up to me to delegate
Otterrai:
8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
Matrici associative in Java come in 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);
}
Maggiori informazioni, vedi Class SoftHashMap: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html
Usa ArrayList <Mappa <String, String>>
Ecco un esempio di codice:
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);
Produzione :
prodotti: [{id = 0001, nome = prod1}, {id = 0002, nome = prod2}]
In realtà Java supporta array associativi chiamati dizionari!
Pensandoci di più, vorrei scartare le tuple come un modo più generico di affrontare questo problema. Mentre le tuple non sono native di Java, io uso Javatuples per fornirmi la stessa funzionalità che esisterebbe in altre lingue. Un esempio di come affrontare la domanda posta è
Map<Pair<Integer, String>, String> arr = new HashMap<Pair<Integer, String>, String>();
Pair p1 = new Pair(0, "name");
arr.put(p1, "demo");
Mi piace questo approccio perché può essere esteso a triple e altri raggruppamenti di ordine superiore con classi e metodi forniti da api.
Per quanto riguarda il commento di PHP "No, a PHP non piacerebbe". In realtà, PHP continuerebbe a soffocare a meno che non imposti dei livelli di eccezione / errore molto restrittivi (per PHP), (e forse nemmeno allora).
Ciò che accadrà per impostazione predefinita è che un accesso a una variabile non esistente / fuori dall'elemento dell'array "disinserisce" il valore a cui si sta assegnando. NO, NON è null. PHP ha un lignaggio Perl / C, da quello che ho capito. Quindi ci sono: variabili non impostate e inesistenti, valori che SONO impostati ma sono NULL, valori falsi booleani, quindi tutto il resto dei linguaggi standard. Devi testare quelli separatamente, OPPURE scegli la valutazione DESTRA integrata nella funzione / sintassi.
NullPointerException
se la mappa esterna non contiene la mappa per l'ingresso0
. PHP non è più permissivo con $ arr [0] ['name'] (non conosco affatto questa lingua)?