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';
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");
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"
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);
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
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 = ...
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);
}
}
équivalent Java du hachage de Perl
HashMap<Integer, HashMap<String, String>> hash;
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}
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}]
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
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.
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.
En fait, Java prend en charge les tableaux associatifs qu'ils sont appelés dictionnaires!
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.