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评估。