Java关联数组

时间:2011-02-25 21:31:23

标签: java hashmap associative-array

如何在PHP中创建和获取Java中的关联数组?

例如:

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

15 个答案:

答案 0 :(得分:328)

Java不支持关联数组,但使用Map可以很容易地实现这一点。例如,

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

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

对于您的示例更加准确(因为您可以使用满足您需求的任何对象替换String)将声明:

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

See the official documentation for more information

答案 1 :(得分:46)

Java没有像PHP这样的关联数组。

您正在使用各种解决方案,例如使用地图,但这取决于您希望如何查找信息。您可以轻松编写一个包含所有信息的类,并将它们存储在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"

答案 2 :(得分:20)

您可以通过地图完成此操作。像

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

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

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

答案 3 :(得分:12)

Java中没有关联数组这样的东西。它的最近亲属是Map,它是强类型的,但是语法/ 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

答案 4 :(得分:10)

查看Map界面和具体类HashMap

创建地图:

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

添加键值对:

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

要检索与键关联的值:

assoc.get("name")

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

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

答案 5 :(得分:5)

Java equivalent of Perl's hash

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

答案 6 :(得分:5)

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

以下是该页面的示例。

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}

答案 7 :(得分:5)

我也在搜索关联数组,并发现地图列表是最佳解决方案。

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

}


}

答案 8 :(得分:3)

使用ArrayList&lt;地图&lt;字符串,字符串&gt; &GT;

这是一个代码示例:

ServiceStatusKey.Should().Match<Status>(p=>p==Status.Pending || p == Status.Active);

输出:

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

答案 9 :(得分:2)

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

答案 10 :(得分:1)

在JDK 1.5(http://tinyurl.com/3m2lxju)中,甚至还有一个注释:“注意:这个类已经过时了。新的实现应该实现Map接口,而不是扩展这个类。” 此致,N。

答案 11 :(得分:1)

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

是的,这需要迭代按键搜索值,但如果你需要所有这些,这将是最好的选择。

答案 12 :(得分:0)

实际上Java确实支持关联数组,它们被称为字典!

答案 13 :(得分:0)

更多地考虑它,我想抛出元组作为处理这个问题的更通用的方法。虽然元组不是Java的原生元素,但我使用Javatuples为我提供了与其他语言相同的功能。如何处理问题的一个例子是

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

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

答案 14 :(得分:-2)

关于PHP评论'不,PHP不喜欢它'。实际上,除非你设置一些非常严格的限制(对于PHP)异常/错误级别(并且可能甚至不是那样),否则PHP会继续使用。

默认情况下,对非现有变量/越界数组元素的访问会“取消”您指定的值。不,那不是空的。根据我的理解,PHP有一个Perl / C谱系。所以有:未设置和不存在的变量,ARE设置但是为NULL的值,布尔值为假值,然后是标准语言的所有其他值。您必须单独测试这些,或者选择内置函数/语法的RIGHT评估。