Java关联数组

我如何可以在PHP中创build和获取Java中的关联数组?

例如:

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

Java不支持关联数组,但是使用Map可以轻松实现。 例如,

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

对你的例子更精确(因为你可以用满足你需要的任何对象replaceString)将声明:

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

有关更多信息,请参阅官方文档

Java没有象PHP那样的关联数组。

对于你正在做的事情有不同的解决scheme,比如使用Map,但这取决于你想要如何查询信息。 您可以轻松编写一个保存所有信息的类,并将它们的实例存储在ArrayList

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

接着…

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

所以你可以像访问他们…

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

你可以通过地图完成。 就像是

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

但是当你开始使用Java的时候,我相信你会发现如果你创build一个代表你的数据的类/模型将是你最好的select。 我会做

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

Java中没有关联数组这样的事情。 它最接近的是一个Map ,它是强types的,但是不太优雅的语法/ API。

这是你可以得到最接近你的例子:

 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 

看看Map接口,以及具体的类HashMap 。

创build地图:

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

要添加键值对:

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

要检索与键关联的值,请执行以下操作:

 assoc.get("name") 

当然,你可以创build一个地图数组,因为它似乎是你想要的:

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

Java相当于Perl的散列

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

Java没有关联数组,最接近的就是Map接口

以下是该页面的示例。

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

如果运行:

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

你会得到:

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

那么我也在search关联数组,并find了地图列表作为最好的解决scheme。

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

不像PHP这样的语言,在Java中,没有关联数组。 使用等效关联数组的一个更方便的方法是使用HashMap,您可以使用HashMap的关键字来提供关联数组的质量。

Java中的关联数组像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); } 

有关更多信息,请参阅SoftHashMap类: https ://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html

使用ArrayList <Map <String,String>>

这里有一个代码示例:

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

输出:

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

实际上Java支持被称为字典的关联数组!

更多地思考这个问题,我想抛弃元组作为处理这个问题的更普遍的方法。 虽然元组不是Java本地的,但我使用Javatuples来为我提供与其他语言相同的function。 如何处理问题的一个例子是

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

我喜欢这种方法,因为它可以扩展到三元组和其他更高级的API提供的类和方法的分组。

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

是的,这需要迭代search键的价值,但如果你需要所有这些,这将是最好的select。

关于PHP的评论“不,PHP不会喜欢它”。 实际上,除非你设置了一些非常有限的(用于PHP的)exception/错误级别(甚至可能还没有),否则PHP会一直处于困境。

默认情况下会发生的一个情况是,访问一个不存在的variables/越界数组元素会“取消”您分配给您的值。 不,那不是空的。 根据我的理解,PHP有一个Perl / C谱系。 所以有:未设置和不存在的variables,设置的值,但是NULL,布尔假值,然后是标准语言所具有的一切。 你必须单独testing那些,或者select在函数/语法中构build的RIGHT评估。