Antworten:
Java unterstützt keine assoziativen Arrays, dies könnte jedoch leicht mit a erreicht werden Map
. Z.B,
Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc
map.get("name"); // returns "demo"
Noch genauer für Ihr Beispiel (da Sie String durch jedes Objekt ersetzen können, das Ihren Anforderungen entspricht) wäre die Deklaration von:
List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name");
Weitere Informationen finden Sie in der offiziellen Dokumentation
ArrayList
fast allen Fällen wegen (unerwartet?) Leistungsunterschiede. Aber das ist eine andere Diskussion.
HashMap
, und schon gar nicht, ohne das Verhalten absichtlich zu bewerten und einen besseren Lastfaktor für Ihren Anwendungsfall zu finden. Der einzige Grund, eine Anfangsgröße anzugeben, besteht darin, dass Sie im Voraus wissen, dass die Karte sehr groß sein wird. HashMap
Verschwenden Sie nicht (viel) Speicher, wenn Sie leer sind. Wenn Sie jedoch eine große Karte erstellen möchten, können Sie mehrere Array-Größen speichern, indem Sie die Größe im Voraus angeben.
Java hat keine assoziativen Arrays wie PHP.
Es gibt verschiedene Lösungen für Ihre Aktivitäten, z. B. die Verwendung einer Karte. Dies hängt jedoch davon ab, wie Sie die Informationen nachschlagen möchten. Sie können einfach eine Klasse schreiben, die alle Ihre Informationen enthält, und Instanzen davon in einer speichern ArrayList
.
public class Foo{
public String name, fname;
public Foo(String name, String fname){
this.name = name;
this.fname = fname;
}
}
Und dann...
List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));
So können Sie darauf zugreifen wie ...
foos.get(0).name;
=> "demo"
Sie können dies über Karten erreichen. Etwas wie
Map<String, String>[] arr = new HashMap<String, String>[2]();
arr[0].put("name", "demo");
Aber wenn Sie anfangen, Java zu verwenden, werden Sie sicher feststellen, dass das Erstellen einer Klasse / eines Modells, das Ihre Daten darstellt, die besten Optionen sind. Ich würde es tun
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);
In Java gibt es kein assoziatives Array. Sein nächster Verwandter ist a Map
, der stark typisiert ist, jedoch eine weniger elegante Syntax / API aufweist.
Dies ist der nächste Punkt, den Sie anhand Ihres Beispiels erreichen können:
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
und InstantiateFactory
und Sachen für?
Schauen Sie sich die Map- Oberfläche und die konkrete Klasse HashMap an .
So erstellen Sie eine Karte:
Map<String, String> assoc = new HashMap<String, String>();
So fügen Sie ein Schlüssel-Wert-Paar hinzu:
assoc.put("name", "demo");
So rufen Sie den einem Schlüssel zugeordneten Wert ab:
assoc.get("name")
Und natürlich können Sie eine Reihe von Karten erstellen, wie es scheint, was Sie wollen:
Map<String, String>[] assoc = ...
Nun, ich war auch auf der Suche nach einem assoziativen Array und fand die Liste der Karten als die beste Lösung.
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);
}
}
HashMap<Integer, HashMap<String, String>> hash;
Java hat keine assoziativen Arrays. Das nächste, was Sie bekommen können, ist die Map-Oberfläche
Hier ist ein Beispiel von dieser Seite.
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);
}
}
Wenn ausgeführt mit:
java Freq if it is to be it is up to me to delegate
Du wirst kriegen:
8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
Assoziative Arrays in Java wie 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);
}
Weitere Informationen finden Sie unter Class SoftHashMap: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html
Verwenden Sie ArrayList <Map <String, String >>
Hier ein Codebeispiel:
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);
Ausgabe :
Produkte: [{id = 0001, name = prod1}, {id = 0002, name = prod2}]
Tatsächlich unterstützt Java assoziative Arrays, die als Wörterbücher bezeichnet werden!
Wenn ich mehr darüber nachdenke, möchte ich Tupel wegwerfen, um dieses Problem allgemeiner zu lösen. Während Tupel nicht in Java beheimatet sind, verwende ich Javatuples , um mir die gleiche Funktionalität bereitzustellen, die in anderen Sprachen vorhanden wäre. Ein Beispiel für den Umgang mit der gestellten Frage ist
Map<Pair<Integer, String>, String> arr = new HashMap<Pair<Integer, String>, String>();
Pair p1 = new Pair(0, "name");
arr.put(p1, "demo");
Ich mag diesen Ansatz, weil er mit API-bereitgestellten Klassen und Methoden auf Tripel und andere Gruppierungen höherer Ordnung erweitert werden kann.
In Bezug auf den PHP-Kommentar "Nein, PHP würde es nicht mögen". Tatsächlich würde PHP weiter tuckern, es sei denn, Sie legen einige sehr restriktive (für PHP) Ausnahme- / Fehlerstufen fest (und vielleicht auch dann nicht).
Was standardmäßig passiert, ist, dass ein Zugriff auf eine nicht vorhandene Variable / ein außerhalb der Grenzen liegendes Array-Element Ihren Wert, den Sie zuweisen, "deaktiviert". NEIN, das ist NICHT null. Nach meinem Verständnis hat PHP eine Perl / C-Linie. Es gibt also: nicht gesetzte und nicht vorhandene Variablen, Werte, die gesetzt sind, aber NULL sind, Boolesche Falschwerte, dann alles andere, was Standardsprachen haben. Sie müssen diese separat testen ODER die in Funktion / Syntax integrierte RECHTE Bewertung auswählen.
NullPointerException
wenn die äußere Karte keine Karte für den Eintrag enthält0
. Ist PHP mit $ arr [0] ['name'] nicht freizügiger (ich kenne diese Sprache überhaupt nicht)?