Java关联数组

dob*_*obs 204 java associative-array hashmap

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

例如:

$arr[0]['name'] = 'demo';
$arr[0]['fname'] = 'fdemo';
$arr[1]['name'] = 'test';
$arr[1]['fname'] = 'fname';
Run Code Online (Sandbox Code Playgroud)

Joh*_*erg 340

Java不支持关联数组,但是使用a可以很容易地实现Map.例如,

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

map.get("name"); // returns "demo"
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 如果你试图访问一个不存在的密钥,PHP不会喜欢它,没有:) (9认同)
  • 永远不要忘记初始化确切的散列大小并将加载因子设置为1:HashMap <String,String>(capacity,1).否则,您可能会实现巨大的开销,并且您的对象需要大量RAM.为ArrayList +1,但为什么不编辑答案? (3认同)
  • 如果外部映射不包含条目“0”的映射,这将抛出“NullPointerException”。PHP 对 $arr[0]['name'] 不是更宽容(我根本不懂这种语言)? (2认同)
  • @edem,*某些*实现是必要的.*今天*但是,**I**在几乎所有情况下都会更喜欢"ArrayList",因为(意外的?)性能差异.但这是另一个讨论. (2认同)
  • @Marcus“*永远不要忘记初始化确切的哈希大小并将负载因子设置为 1*”-您从哪里得到这个建议?您几乎“永远”不应该指定“HashMap”的加载因子,当然,如果没有有意对行为进行基准测试并为您的用例找到更好的加载因子。指定初始大小的唯一原因是您事先知道地图将非常大。如果“HashMap”为空,则不会浪费(太多)内存,但如果您打算创建一个大型映射,则可以通过预先指定其大小来保存多个数组调整大小。 (2认同)

Jer*_*emy 47

Java没有像PHP那样的关联数组.

您正在使用各种解决方案,例如使用Map,但这取决于您希望如何查找信息.您可以轻松编写一个包含所有信息的类,并将它们存储在一个ArrayList.

public class Foo{
    public String name, fname;

    public Foo(String name, String fname){
        this.name = name;
        this.fname = fname;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后...

List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));
Run Code Online (Sandbox Code Playgroud)

所以你可以像...一样访问它们

foos.get(0).name;
=> "demo"
Run Code Online (Sandbox Code Playgroud)


Ami*_*far 20

您可以通过地图完成此操作.就像是

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

但是当你开始使用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);
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 12

Java中没有关联数组这样的东西.它最接近的是a 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
Run Code Online (Sandbox Code Playgroud)


Chr*_*isJ 10

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

要创建地图:

Map<String, String> assoc = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)

要添加键值对:

assoc.put("name", "demo");
Run Code Online (Sandbox Code Playgroud)

要检索与键关联的值:

assoc.get("name")
Run Code Online (Sandbox Code Playgroud)

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

Map<String, String>[] assoc = ...
Run Code Online (Sandbox Code Playgroud)


alc*_*ist 6

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

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

}


}
Run Code Online (Sandbox Code Playgroud)


Osc*_*Ryz 5

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果运行:

java Freq if it is to be it is up to me to delegate
Run Code Online (Sandbox Code Playgroud)

你会得到:

8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
Run Code Online (Sandbox Code Playgroud)