Java associatieve array

Hoe kan ik associatieve arrays in Java maken en ophalen zoals ik dat in PHP kan?

Bijvoorbeeld:

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

Antwoord 1, autoriteit 100%

Java ondersteunt geen associatieve arrays, maar dit kan eenvoudig worden bereikt met een Map. Bijvoorbeeld

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

Nog nauwkeuriger voor uw voorbeeld (omdat u String kunt vervangen door elk object dat aan uw behoeften voldoet) zou zijn om te declareren:

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

Zie de officiële documentatie voor meer informatie


Antwoord 2, autoriteit 13%

Java heeft geen associatieve arrays zoals PHP.

Er zijn verschillende oplossingen voor wat u doet, zoals het gebruik van een kaart, maar het hangt af van hoe u de informatie wilt opzoeken. U kunt eenvoudig een klasse schrijven die al uw informatie bevat en exemplaren hiervan opslaan in een ArrayList.

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

En dan…

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

Dus je hebt er toegang toe als…

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

Antwoord 3, autoriteit 5%

U kunt dit doen via Kaarten. Iets als

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

Maar als je Java begint te gebruiken, weet ik zeker dat je de beste optie zult zijn als je een klasse/model maakt dat je gegevens vertegenwoordigt. Ik zou doen

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);

Antwoord 4, autoriteit 3%

Kijk naar de Kaart-interface en naar de concrete klasse HashMap.

Een kaart maken:

Map<String, String> assoc = new HashMap<String, String>();

Een sleutel/waarde-paar toevoegen:

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

Om de waarde op te halen die aan een sleutel is gekoppeld:

assoc.get("name")

En zeker, je kunt een array van Maps maken, zoals het lijkt te zijn wat je wilt:

Map<String, String>[] assoc = ...

Antwoord 5, autoriteit 3%

Er bestaat niet zoiets als een associatieve array in Java. Zijn naaste verwant is een Map, die sterk getypt is, maar een minder elegante syntaxis/API heeft.

Dit komt het dichtst in de buurt op basis van uw voorbeeld:

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

Antwoord 6, autoriteit 2%

Nou, ik was ook op zoek naar associatieve arrays en vond de lijst met kaarten als de beste oplossing.

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);
}
}

Antwoord 7

Java-equivalent van Perl’s hash

HashMap<Integer, HashMap<String, String>> hash;

Antwoord 8

Java heeft geen associatieve arrays, het dichtstbijzijnde dat je kunt krijgen is de Kaartinterface

Hier is een monster van die 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);
    }
}

indien uitgevoerd met:

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

u krijgt:

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

Antwoord 9

Associatieve arrays in Java zoals 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);
}

Meer info, zie Class SoftHashMap: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html


Antwoord 10

Gebruik ArrayList < Kaart < Snaar, Snaar > >

Hier een codevoorbeeld:

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);

Uitvoer:

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


Antwoord 11

In JDK 1.5 (http://tinyurl.com/3m2lxju) staat zelfs een opmerking: “OPMERKING: deze klasse is verouderd. Nieuwe implementaties zouden de kaartinterface moeten implementeren in plaats van deze klasse uit te breiden.”
Groeten, N.


Antwoord 12

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

Ja, dit vereist iteratie voor het zoeken op sleutel, maar als je ze allemaal nodig hebt, is dit de beste keuze.


Antwoord 13

In feite ondersteunt Java associatieve arrays, ze worden woordenboeken genoemd!


Antwoord 14

Als ik er meer over nadenk, wil ik tuples weggooien als een meer algemene manier om met dit probleem om te gaan. Hoewel tuples niet native zijn voor Java, gebruik ik Javatuplesom mij dezelfde functionaliteit te bieden die in andere talen zou bestaan. Een voorbeeld van hoe om te gaan met de gestelde vraag is

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

Ik hou van deze benadering omdat deze kan worden uitgebreid tot triples en andere hogere geordende groeperingen met door API geleverde klassen en methoden.


Antwoord 15

Wat betreft de PHP-commentaar ‘Nee, PHP zou het niet leuk vinden’. Eigenlijk zou PHP blijven ploeteren, tenzij je een aantal zeer beperkende (voor PHP) uitzonderings-/foutniveaus instelt (en misschien zelfs dan niet).

Wat standaard ZAL gebeuren, is dat een toegang tot een niet-bestaand variabele/buiten de grenzen array-element de waarde die u toewijst, ‘uitschakelt’. NEE, dat is NIET nul. PHP heeft een Perl/C-afstamming, voor zover ik het begrijp. Er zijn dus: niet-ingestelde en niet-bestaande variabelen, waarden die ZIJN ingesteld maar NULL zijn, Boolean False-waarden, dan al het andere dat standaardtalen hebben. U moet deze afzonderlijk testen OF de JUISTE evaluatie kiezen die is ingebouwd in functie/syntaxis.

Other episodes