web-dev-qa-db-fra.com

Java tableau associatif

Comment créer et récupérer des tableaux associatifs dans Java comme je le peux avec PHP?

Par exemple:

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

Java ne prend pas en charge les tableaux associatifs, mais cela pourrait facilement être réalisé avec un Map. Par exemple.,

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

map.get("name"); // returns "demo"

Encore plus fidèle à votre exemple (puisque vous pouvez remplacer String par tout objet répondant à vos besoins) serait de déclarer:

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

Voir la documentation officielle pour plus d'informations

336
Johan Sjöberg

Java n'a pas de tableaux associatifs comme PHP.

Il existe diverses solutions à votre travail, telles que l’utilisation d’une carte, mais cela dépend de la manière dont vous souhaitez rechercher les informations. Vous pouvez facilement écrire une classe qui contient toutes vos informations et en stocker des instances dans un fichier ArrayList.

public class Foo{
    public String name, fname;

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

Puis...

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

Donc, vous pouvez y accéder comme ...

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

Vous pouvez accomplir cela via Maps. Quelque chose comme

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

Mais lorsque vous commencez à utiliser Java, je suis sûr que vous constaterez que si vous créez une classe/un modèle qui représente vos données, ce seront vos meilleures options. je ferais

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);
20
Amir Raminfar

Le tableau associatif n'existe pas en Java. Son plus proche parent est un Map, qui est fortement typé, mais qui a une syntaxe/API moins élégante.

C’est le plus proche que vous puissiez obtenir sur la base de votre exemple:

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
12
Tomasz Nurkiewicz

Regardez l'interface Map , et la classe concrète HashMap .

Pour créer une carte:

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

Pour ajouter une paire clé-valeur:

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

Pour récupérer la valeur associée à une clé:

assoc.get("name")

Et bien sûr, vous pouvez créer un tableau de cartes, car il semble être ce que vous voulez:

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

Eh bien, j'étais aussi à la recherche d'un tableau associatif et j'ai trouvé la liste des cartes comme la meilleure solution.

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

}


}
6
alchemist

équivalent Java du hachage de Perl

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

Java n'a pas de tableaux associatifs, la chose la plus proche que vous puissiez obtenir est le interface de la carte

Voici un exemple de cette page.

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 exécuté avec:

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

Tu auras:

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

Utiliser ArrayList <Map <String, String>>

Voici un exemple de code:

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

Sortie:

produits: [{id = 0001, nom = prod1}, {id = 0002, nom = prod2}]

3
abahet

Tableaux associatifs dans Java comme dans 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);
}

Plus d'infos, voir Classe SoftHashMap: https://shiro.Apache.org/static/1.2.2/apidocs/org/Apache/shiro/util/SoftHashMap.html

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

Oui, cela nécessite une itération pour rechercher une valeur par clé, mais si vous en avez besoin, ce sera le meilleur choix.

1
msangel

Dans JDK 1.5 (http://tinyurl.com/3m2lxju), il y a même une remarque: "REMARQUE: cette classe est obsolète. Les nouvelles implémentations doivent implémenter l'interface Map plutôt que d'étendre cette classe." Cordialement, N.

1
shadrik

En fait, Java prend en charge les tableaux associatifs qu'ils sont appelés dictionnaires!

0
Matt Seidlitz

En y réfléchissant plus longuement, je voudrais utiliser des tuples comme moyen plus général de traiter ce problème. Bien que les tuples ne soient pas natifs de Java, j'utilise Javatuples pour me fournir les mêmes fonctionnalités que celles existant dans d'autres langues. Un exemple de la façon de traiter la question posée est

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

J'aime cette approche car elle peut être étendue aux triples et à d'autres regroupements ordonnés avec des classes et des méthodes fournies par api.

0
demongolem