Java ассоциативный массив - PullRequest
       58

Java ассоциативный массив

198 голосов
/ 26 февраля 2011

Как я могу создавать и извлекать ассоциативные массивы в Java, как я могу в PHP?

Например:

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

Ответы [ 15 ]

330 голосов
/ 26 февраля 2011

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

Для получения дополнительной информации см. Официальную документацию

46 голосов
/ 26 февраля 2011

У 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"
20 голосов
/ 26 февраля 2011

Вы можете сделать это через Карты.Что-то вроде

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);
12 голосов
/ 26 февраля 2011

В 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
10 голосов
/ 26 февраля 2011

Посмотрите на интерфейс Карта и конкретный класс HashMap .

Чтобы создать карту:

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

Добавитьпара ключ-значение:

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

Чтобы извлечь значение, связанное с ключом:

assoc.get("name")

И, конечно же, вы можете создать массив карт, как кажется, чтоВы хотите:

Map<String, String>[] assoc = ...
6 голосов
/ 25 августа 2011

Ну, я также искал ассоциативный массив и нашел Список карт как лучшее решение.

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

}


}
5 голосов
/ 26 февраля 2011

Java не имеет ассоциативных массивов, самое близкое, что вы можете получить, это Интерфейс карты

Вот пример этой страницы.запустить с:

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}
5 голосов
/ 26 февраля 2011

Java-эквивалент хеша Perl

HashMap<Integer, HashMap<String, String>> hash;
3 голосов
/ 07 января 2016

Использовать ArrayList <Карта <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}]

2 голосов
/ 20 августа 2015

Ассоциативные массивы в 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

...